/* _ _ ___ _____ ___ __ __ _(_) | ____ _ ___ / _ \___ / _ \ / /_ \ \ / / | |/ / _` / __| | | | / / | | | '_ \ \ V /| | < (_| \__ \ |_| |/ /| |_| | (_) | \_/ |_|_|\_\__,_|___/\___//_/ \___/ \___/ VIKAS SINGH */ #include #define endl "\n" #define pb push_back typedef long long ll; typedef unsigned long long ull; typedef unsigned int ui; typedef std::vector vi; typedef std::vector vl; #define f(a,b,c) for(int a=b;a>a[ix]; #define p(x) printf("%d\n",x); #define pl(x) printf("%lld\n",x); #define p1d(a,n) for(int ix=0;ix m; int n = s.length(); // table for storing results (2 rows for odd- // and even-length palindromes int R[2][n+1]; // Find all sub-string palindromes from the given input // string insert 'guards' to iterate easily over s s = "@" + s + "#"; for (int j = 0; j <= 1; j++) { int rp = 0; // length of 'palindrome radius' R[j][0] = 0; int i = 1; while (i <= n) { // Attempt to expand palindrome centered at i while (s[i - rp - 1] == s[i + j + rp]) rp++; // Incrementing the length of palindromic // radius as and when we find vaid palindrome // Assigning the found palindromic length to odd/even // length array R[j][i] = rp; int k = 1; while ((R[j][i - k] != rp - k) && (k < rp)) { R[j][i + k] = min(R[j][i - k],rp - k); k++; } rp = max(rp - k,0); i += k; } } // remove 'guards' s = s.substr(1, n); // Put all obtained palindromes in a hash map to // find only distinct palindromess m[string(1, s[0])]=1; for (int i = 1; i <= n; i++) { for (int j = 0; j <= 1; j++) for (int rp = R[j][i]; rp > 0; rp--) m[s.substr(i - rp - 1, 2 * rp + j)]=1; m[string(1, s[i])]=1; } //printing all distinct palindromes from hash map return m.size(); } int main(){ // freopen("input.in","r",stdin); // freopen("output.out","w",stdout); ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n,q; string s; cin>>n>>q; cin>>s; while(q--) { int t,xi,xj; cin>>t>>xi>>xj; if(t==1){ int k; cin>>k; for (int i = xi; i <=xj ; ++i) { s[i]= ((s[i]+k)%26)+'a'; } }else{ string st=""; for(int i=xi;i<=xj;i++){ st=st+ s[i]; } cout<