#include #include #include #include #include #define X first #define Y second #define MP make_pair #define PB push_back #define ll long long #define CLR(x) memset(x,0,sizeof(x)) #define vrep(i, v) for(int i = 0; i < v.size(); i++) #define rep(i, a, b) for(int i = a; i <= b; i++) #define drep(i, a, b) for(int i = a; i >= b; i--) using namespace std; const double pi = acos(-1.), eps = 1e-6; const int Maxn=100010,Maxm=2500000,Mo=1e9 + 7,oo=INT_MAX >> 1; const int sp[4][2] = {{-1,0},{0,1},{1,0},{0,-1}}; int T; using namespace std; int n,m; string st; int cnt[26]; int t[Maxn * 3][26], mk[Maxn * 3]; ll pw(ll a, ll b){ ll ans = 1; for (;b;b >>= 1, a = a * a % Mo) if (b&1) ans = ans * a % Mo; return ans; } void build(int k,int l,int r){ if (l > r) return; if (l == r){ t[k][st[l - 1] - 'a'] = 1; return; } int mid = (l + r) >> 1; build(k * 2, l, mid); build(k * 2 + 1, mid + 1, r); for (int i = 0; i < 26; i++) t[k][i] = t[k * 2][i] + t[k * 2 + 1][i]; } void check(int k, int l,int r){ if (!mk[k]) return; int tmp[26]; for (int i = 0; i < 26; i++) tmp[(i + mk[k]) % 26] = t[k][i]; for (int i = 0; i < 26; i++) t[k][i] = tmp[i]; if (l < r){ (mk[k * 2] += mk[k]) %= 26; (mk[k * 2 + 1] += mk[k]) %= 26; } mk[k] = 0; } void alter(int k,int l,int r,int x, int y, int tl){ check(k,l,r); if (r < x || y < l) return; if (x <= l && r <= y){ mk[k] += tl; mk[k] %= 26; check(k,l,r); return; } int mid = (l + r) >> 1; alter(k * 2, l, mid , x, y, tl); alter(k * 2 + 1, mid + 1, r , x, y, tl); for (int i = 0; i < 26; i++) t[k][i] = t[k * 2][i] + t[k * 2 + 1][i]; } void ask(int k,int l,int r,int x, int y){ check(k,l,r); if (r < x || y < l) return; if (x <= l && r <= y){ for (int i = 0; i < 26; i++) cnt[i] += t[k][i]; return; } int mid = (l + r) >> 1; ask(k * 2, l, mid, x, y); ask(k * 2 + 1, mid + 1, r, x, y); } int main() { cin >> n >> m; cin >> st; build(1,1,n); while(m--){ int op, l, r, tl; cin >> op >> l >> r; l ++ , r ++; if (op == 1){ cin >> tl; tl %= 26; alter(1,1,n,l,r,tl); } else { CLR(cnt); ask(1,1,n,l,r); ll all = 1, ans = 0; for (int i = 0; i < 26; i++) if (cnt[i]) all = all * pw(2, cnt[i] - 1) % Mo; ans = all - 1; for (int i = 0; i < 26; i++) if (cnt[i]) (ans += all) %= Mo; cout << ans << endl; } } return 0; }