//SMALL TEST CASE #include #include #include #include #include #include using namespace std; #define NMAX 100000 #define MOD 1000000007 char str[NMAX + 10]; int bit[26][NMAX + 10]; int N; void update(int i, int ch) { while(i <= N) { bit[ch][i]++; i += (i & -i); } } int count(int ch, int L, int R) { int cnt2 = 0, cnt1 = 0; int ix = R; while(ix > 0) { cnt1 += bit[ch][ix]; ix -= (ix & -ix); } ix = L - 1; while(ix > 0) { cnt2 += bit[ch][ix]; ix -= (ix & -ix); } return cnt1 - cnt2; } long long int fast_pow(long long int base, long long int pow) { if(pow == 0) return 1; if(pow == 1) return base; long long int temp = fast_pow(base, pow/2); if(pow % 2 == 0) return (temp %MOD * temp %MOD)%MOD; else return (temp %MOD * temp %MOD * base % MOD)%MOD; } int main() { /* Enter your code here. Read input from STDIN. Print output to STDOUT */ int query; scanf("%d %d\n",&N,&query); scanf("%s",str + 1); str[N + 1] = '\0'; for(int i = 1 ; i <= N; i++) update(i, str[i] - 'a'); for(int t = 0; t < query; t++) { int type; scanf("%d",&type); //cout << type << "---"<< endl; if(type == 2) { int L, R; long long int ans = 0; scanf("%d %d",&L, &R); L++; R++; int ct[26], dist_letters = 0; memset(ct, 0 , sizeof(ct)); for(int i = 0; i < 26; i++) { ct[i] = count(i, L, R); //printf("%d**",ct[i]); if(ct[i] > 0) dist_letters++; } if(R - L + 1 >= 3) { ans += (R - L + 1 - 2) * dist_letters * (dist_letters - 1); } //cout << "***--" << ans << endl; for(int i = 0; i < 26; i++) { if(ct[i] == 0) continue; ans += (fast_pow(2, ct[i]) % MOD - 1)%MOD; } printf("%lld\n",ans); } else { int L,R,U; cin >> L >> R >> U; } } return 0; }