#include #define pb push_back #define mp make_pair #define fst first #define snd second #define fore(i,a,b) for(int i=a,ThxDem=b;i=b||e<=a)return; if(s>=a&&e<=b){ lazy[k]+=v; lazy[k]%=26; st_push(k,s,e); return; } int m=(s+e)/2; st_upd(2*k,s,m,a,b,v); st_upd(2*k+1,m,e,a,b,v); merge(st[k],st[2*k],st[2*k+1]); } void st_query(int k, int s, int e, int a, int b, int *r){ if(s>=b||e<=a)return; st_push(k,s,e); if(s>=a&&e<=b){ merge(r,r,st[k]); return; } int m=(s+e)/2; st_query(2*k,s,m,a,b,r); st_query(2*k+1,m,e,a,b,r); } int p2[100005]; int rr[32]; int doit(){ int q=0,k=0; fore(i,0,26){ if(rr[i]){ q++; k+=rr[i]-1; } } return (1LL*(q+1)*p2[k]+MOD-1)%MOD; } int main(){ p2[0]=1; fore(i,1,100005)p2[i]=((p2[i-1])*2)%MOD; scanf("%d%d%s",&n,&q,ss); fore(i,0,n)ss[i]-='a'; st_init(1,0,n); while(q--){ int t,i,j; scanf("%d%d%d",&t,&i,&j); if(t==1){ int v; scanf("%d",&v); st_upd(1,0,n,i,j+1,v); } else { memset(rr,0,sizeof(rr)); st_query(1,0,n,i,j+1,rr); //fore(i,0,26)printf(" %d",rr[i]);puts(""); printf("%d\n",doit()); } } return 0; }