#include using namespace std; #define F first #define S second #define mp make_pair #define pb push_back #define CLEAR(a) memset(a,0,sizeof a) #define REP(i,n) for(int i=0;i pii; const int MOD = 1e9 + 7; const int MAX = 1e5 + 5; int f[26]; vector v[26]; LL mod_pow(int base, int e){ LL ret = 1, b = base; while(e){ if(e%2) ret = (ret*b)%MOD; b = (b*b)%MOD; e /= 2; } return ret; } LL inv(int n){ return mod_pow(n, MOD-2); } int main() { int n, q; cin >> n >> q; string s; cin >> s; REP(i,n){ v[s[i]-'a'].pb(i); } while(q--){ int t; cin >> t; if(t == 1){ int i, j, x; cin >> i >> j >> x; for(int k=i;k<=j;k++) s[k] = 'a'+ (s[k]-'a'+x)%26; } else{ int i, j; cin >> i >> j; CLEAR(f); if(j-i < 1000){ for(int k=i;k<=j;k++){ f[s[k]-'a']++; } } else{ REP(k, 26){ f[k] = upper_bound(v[k].begin(), v[k].end(), j) - lower_bound(v[k].begin(), v[k].end(), i); } } LL ret = 0, sags = 1, tmp; REP(i, 26) if(f[i]) sags = (sags*mod_pow(2, f[i]-1))%MOD; REP(i, 26){ if(f[i] == 0) continue; tmp = mod_pow(2, f[i]-1); tmp = (tmp*sags)%MOD; LL tp = mod_pow(2, f[i]-1); tp = inv(tp); tmp = (tmp*tp)%MOD; ret = (ret+tmp)%MOD; } ret = (ret+sags-1+MOD)%MOD; cout << ret <<"\n"; } } return 0; }