#include using namespace std; typedef long long ll; int t[26][400005]={0}; /*void build_tree(int v,int tl,int tr) { if(tl==tr) { t[x][v]=a[tl]*a[tl]; return ; } int tm=(tl+tr)/2; build_tree(2*v,tl,tm); build_tree(2*v+1,tm+1,tr); t[v]=t[2*v]+t[2*v+1]; }*/ int query(int v,int tl,int tr,int l,int r,int x) { if(l>r) return 0; if(tl==l && tr==r) { return t[x][v]; } else { int tm=(tl+tr)/2; return query(2*v,tl,tm,l,min(r,tm),x)+query(2*v+1,tm+1,tr,max(l,tm+1),r,x); } } void update(int v,int tl,int tr,int pos,int val,int x) { if(tl==tr) { t[x][v]+=val; } else { int tm=(tl+tr)/2; if(pos<=tm) update(2*v,tl,tm,pos,val,x); else update(2*v+1,tm+1,tr,pos,val,x); t[x][v]=t[x][2*v]+t[x][2*v+1]; } } int min1=INT_MAX; typedef pair ii; ll gcd(ll a,ll b) { ll r=1; while(a%b!=0) { r=a%b; a=b; b=r; } return b; } ll modexp(ll base,ll pow1,ll mod) { ll res=1; for(;pow1>0;pow1=pow1>>1) { if(pow1&1) { res=(res*base)%mod; } base=(base*base)%mod; } return res; } ll count1[26]; char b[100005]; int a[100005]; int main() { ll t,p,i,j,r,c=1,s=0,max1=0,m,l,min1,ans=0,n,k,q,x,mod=10e8+7; scanf("%lld%lld",&n,&q); scanf("%s",&b); for(i=0;i0) { count2++; ans=(ans*modexp(2,count1[i]-1,mod))%mod; } } ans=((ans)*count2+(ans-1))%mod; printf("%lld\n",ans); } else { scanf("%lld%lld%lld",&l,&r,&k); /*for(i=0;i<26;i++) { ll x1=query(1,0,n-1,l,r,i); update(1,0,n-1,l,r,-x1); }*/ for(i=l;i<=r;i++) { //a[i]=(a[i]+k)%26; // count1[a[i]]++; ll x1=query(1,0,n-1,i,i,a[i]); update(1,0,n-1,i,-1,a[i]); a[i]=(a[i]+k)%26; update(1,0,n-1,i,1,a[i]); } } } return 0; }