//let's keep it simple and easy.... #include #include #define ll long long int #define pb emplace_back #define mp make_pair #define pii pair #define vi vector #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) #define rep(i,a,b) for (__typeof((b)) i=(a);i<(b);i+=1) #define all(a) (a).begin(),(a).end() #define F first #define S second #define sz(x) (int)x.size() #define mod 1000000007 #define endl '\n' #define si(x) scanf("%d",&x); using namespace std; int p(string s) { map m; int n = s.size(); int R[2][n+1]; s = "@" + s + "#"; for (int j = 0; j <= 1; j++) { int rp = 0; R[j][0] = 0; int i = 1; while (i <= n) { while (s[i - rp - 1] == s[i + j + rp]) rp++; 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; } } s = s.substr(1, n); 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; } map::iterator ii; int answer=0; for (ii = m.begin(); ii!=m.end(); ++ii) answer++; return answer; } int main() { int n,m; cin >>n>>m; string a; cin >>a; while(m--) { int q; cin >>q; if(q==1) { int x,y,t; cin >>x>>y>>t; t=t%26; rep(i,x,y+1) { a[i]=((int)(a[i]-'a')+t)%26+'a'; } } else { int x,y; cin >>x>>y; cout<