#include #define ll long long #define MOD 1000000007 using namespace std; struct node{ vector freq; ll flag, upd; node(){this->upd=0;this->flag=0;this->freq.resize(30);} void merge(vector v1, vector v2){ for(int i=0; i<26; i++) freq[i] = v1[i]+v2[i]; } }; node tree[400100]; string str=""; void construct(int s, int e, int idx){ if(s == e){ tree[idx] = node(); tree[idx].freq[str[s]-'a']++; return ; } int mid = (s+e)/2, left = idx<<1, right = left+1; construct(s, mid, left); construct(mid+1, e, right); tree[mid] = node(); tree[mid].merge(tree[left].freq, tree[right].freq); } void refresh(int idx){ int par = idx>>1; if(par and tree[par].flag){ vector cp = tree[idx].freq; ll upd = tree[par].upd; for(int i=0; i<26; i++) tree[idx].freq[(i+upd)%26] = cp[i]; tree[idx].upd += upd; tree[idx].flag = 2; tree[par].flag--; if(tree[par].flag == 0){tree[par].upd = 0;} } } void update(int s, int e, int l, int r, int idx, ll t){ refresh(idx); if(r < s or e < l)return ; if(l <= s and e <= r){ vector cp = tree[idx].freq; for(int i=0; i<26; i++){ tree[idx].freq[(i+t)%26] = cp[i]; } tree[idx].flag = 2; tree[idx].upd += t; return ; } int mid = (s+e)/2, left = idx<<1, right = left+1; update(s, mid, l, r, left, t); update(mid+1, e, l, r, right, t); tree[idx].merge(tree[left].freq, tree[right].freq); } vector query(int s, int e, int l, int r, int idx){ refresh(idx); vector ret; ret.resize(30); if(e < l or r < s)return ret; if(l <= s and e <= r)return tree[idx].freq; int mid =(s+e)/2, left = idx<<1, right =left+1; vector lc = query(s, mid, l, r, left); vector rc = query(mid+1,e , l, r, right); for(int i=0; i<26; i++) ret[i] = lc[i]+rc[i]; return ret; } ll power(ll a, ll b, ll mod){ ll ret = 1; while(b){ if(b&1)ret = ret*a%mod; a = a*a %mod; b>>=1; } return ret; } int main(){ ll pw[100100]={0}; pw[0] = 1; for(int i=1; i<=100000; i++) pw[i] = (pw[i-1]*2)%MOD; ll inv = power(2, MOD-2, MOD); ios::sync_with_stdio(false); cin.tie(NULL); ll n,q;cin>>n>>q; cin>>str; construct(0, n-1, 1); while(q--){ int type;cin>>type; if(type == 1){ int x, y, t;cin>>x>>y>>t; update(0, n-1, x, y, 1, t); } else{ int x, y; cin>>x>>y; vector res = query(0, n-1, x, y, 1); ll odd[30], even[30]; ll ans = 1; ll tot=1; for(int i=0; i<26; i++){ even[i] = odd[i] = (pw[res[i]-1]*inv)%MOD; tot = (tot*even[i])%MOD; } for(int i=0; i<26; i++) ans = (ans*even[i])%MOD; ans = (ans-1+MOD)%MOD; for(int i=0; i<26; i++){ ll x= (tot*power(even[i], MOD-2,MOD))%MOD; ans = (ans+(odd[i]*x)%MOD)%MOD; } cout<