#include "bits/stdc++.h" using namespace std; typedef long long ll; typedef vector vi; typedef pair ii; #define fill(a,x) memset(a,x,sizeof(a)) #define pb push_back #define sz(x) (int)x.size() #define all(x) x.begin(),x.end() #define F first #define S second #define FOR(i,a,b) for(int i = a; i<=b; ++i) #define NFOR(i,a,b) for(int i = a; i>=b; --i) #define fast ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0) const ll INF = 1e18; const int mod = 1e9+7; const int N = 1e5+10; int pw2[N]; int mast[26]; #define c1 (curr<<1) #define c2 ((curr<<1)|1) #define mid ((l+r)>>1) int seg[26][4*N];int lazy[4*N]; bool upd[4*N]; void push(int curr,int l,int r){ if(upd[curr]){ int t = lazy[curr]; int temp[26];fill(temp,0); FOR(i,0,25){ temp[(i + t)%26] = seg[i][curr]; } FOR(i,0,25)seg[i][curr] = temp[i]; if(l != r){ lazy[c1] = (lazy[c1] + lazy[curr])%26;//lol lazy[c2] = (lazy[c2] + lazy[curr])%26;//lol upd[c1] = upd[c2] = 1; } lazy[curr] = 0; //lol upd[curr] = 0; } } void update1(int curr,int l,int r,int x,int y,int val,int h){ if(l > r || x > r || y < l)return; if(x <= l && r <= y){ seg[h][curr] += val; return; } update1(c1,l,mid,x,y,val,h);update1(c2,mid+1,r,x,y,val,h); FOR(i,0,25)seg[i][curr] = seg[i][c1] + seg[i][c2]; } void update(int curr,int l,int r,int x,int y,int val){ push(curr,l,r); if(l > r || x > r || y < l)return; if(x <= l && r <= y){ lazy[curr] = (lazy[curr] + val) % 26; //lol upd[curr] = 1; push(curr,l,r); return; } update(c1,l,mid,x,y,val);update(c2,mid+1,r,x,y,val); FOR(i,0,25)seg[i][curr] = seg[i][c1] + seg[i][c2]; } void query(int curr,int l,int r,int x,int y){ push(curr,l,r); if(l > r || x > r || y < l)return; if(x <= l && r <= y){ FOR(i,0,25)mast[i]+=seg[i][curr]; return; } query(c1,l,mid,x,y);query(c2,mid+1,r,x,y); } int main(){ fast; pw2[0] = 1; FOR(i,1,N-1){ pw2[i] = 2LL * pw2[i-1] % mod; } int n,q;cin >> n >> q; string s; cin >> s; FOR(i,0,n-1)update1(1,0,n-1,i,i,1,s[i]-'a'); while(q--){ int t;cin >> t; if(t == 2){ fill(mast,0); int l,r;cin >> l >> r; query(1,0,n-1,l,r); int lol = 0; FOR(i,0,25)lol += (mast[i] > 0); ll ret = (lol + 1); ret = ret * pw2[r-l+1-lol] % mod; ret--; if(ret < 0)ret += mod; cout << ret << "\n"; } if(t == 1){ int l,r,i;cin >> l >> r >> i; i = i%26; update(1,0,n-1,l,r,i); } } return 0; }