//The best is yet to come... #include #include using namespace std; #define ll long long int #define inf 1000000000000 #define mod 1000000007 #define pb push_back #define mp make_pair #define all(v) v.begin(),v.end() #define S second #define F first #define boost1 ios::sync_with_stdio(false); #define boost2 cin.tie(0); #define mem(a,val) memset(a,val,sizeof a) #define endl "\n" #define maxn 100001 ll tree[26][4*maxn],lazy[4*maxn],temp[26]; char arr[maxn]; ll bpow(ll x,ll n) { ll ans=1; while(n>0) { if(n&1) ans*=x; x*=x; ans%=mod; x%=mod; n/=2; } return ans; } void build(ll node,ll a,ll b) { if(a==b) { tree[arr[a]-'a'][node]++; return; } ll mid=(a+b)/2; build(2*node,a,mid); build(2*node+1,mid+1,b); for(int i=0;i<26;i++) tree[i][node]=tree[i][2*node]+tree[i][2*node+1]; } void update(ll node,ll a,ll b,ll l,ll r,ll val) { if(lazy[node]) { for(int i=0;i<26;i++) temp[(i+lazy[node])%26]=tree[i][node]; for(int i=0;i<26;i++) tree[i][node]=temp[i]; if(a!=b) { lazy[2*node]+=lazy[node]; lazy[2*node+1]+=lazy[node]; } lazy[node]=0; } if(a>b || a>r || b=l && b<=r) { for(int i=0;i<26;i++) temp[(i+val)%26]=tree[i][node]; for(int i=0;i<26;i++) tree[i][node]=temp[i]; if(a!=b) { lazy[2*node]+=val; lazy[2*node+1]+=val; } return; } ll mid=(a+b)/2; update(2*node,a,mid,l,r,val); update(2*node+1,mid+1,b,l,r,val); for(int i=0;i<26;i++) tree[i][node]=tree[i][2*node]+tree[i][2*node+1]; } ll query(ll node,ll a,ll b,ll l,ll r,ll id) { if(lazy[node]) { for(int i=0;i<26;i++) temp[(i+lazy[node])%26]=tree[i][node]; for(int i=0;i<26;i++) tree[i][node]=temp[i]; if(a!=b) { lazy[2*node]+=lazy[node]; lazy[2*node+1]+=lazy[node]; } lazy[node]=0; } if(a>b || a>r || b=l && b<=r) return tree[id][node]; ll mid=(a+b)/2; return query(2*node,a,mid,l,r,id)+query(2*node+1,mid+1,b,l,r,id); } int main() { boost1;boost2; ll i,j,n,q,type,l,r,val,x,y; string s; cin>>n>>q; cin>>s; s=" "+s; for(i=1;i<=n;i++) arr[i]=s[i]; build(1,1,n); //cout<>type; if(type==1) { cin>>l>>r>>val; l++;r++; update(1,1,n,l,r,val); } else { cin>>l>>r; l++; r++; ll ans1=1; ll ctr=0; for(i=0;i<26;i++) { x=query(1,1,n,l,r,i); if(x) { ans1=(ans1*bpow(2,x-1))%mod; ctr++; } } ll ans=(ctr*ans1)%mod; ans=(ans+ans1)%mod; ans=(ans-1+mod)%mod; cout<