#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=5e4+5,sqN=225;
int n,m,a[N],p[sqN][26],pos[N],lm[sqN],rm[sqN],key,lazy[sqN],t[26],op,x,y;
char u[3];
inline int by(char w){
if('a'<=w&&w<='z') return (int)w-96;
if('A'<=w&&w<='Z') return (int)w-64;}
inline int getans(int l,int r,int v){ int res=0;
if(lazy[pos[r]]) {if(lazy[pos[r]]==v) return r-l+1;else return 0;}
for(int i=l;i<=r;i++) if(a[i]==v) res++;
return res;}
inline int read(){
int x=0,f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
return x*f;}
inline void pushdown(int y){
if(lazy[y]) for(int i=lm[y];i<=rm[y];i++) a[i]=lazy[y];
lazy[y]=0;}
inline int query(int l,int r,int v){
int ls=pos[l],rs=pos[r],res=0;
if(ls==rs){return getans(l,r,v);}
res+=getans(l,rm[ls],v),res+=getans(lm[rs],r,v);
for(int i=ls+1;i<=rs-1;i++) res+=p[i][v];
return res;}
inline void modifly(int l,int r,int v){
int ls=pos[l],rs=pos[r];
if(ls==rs){ pushdown(rs);
for(int i=l;i<=r;i++) p[rs][a[i]]--,a[i]=v,p[rs][v]++;}
pushdown(ls),pushdown(rs);
for(int i=l;i<=rm[ls];i++) p[ls][a[i]]--,a[i]=v,p[ls][v]++;
for(int i=lm[rs];i<=r;i++) p[rs][a[i]]--,a[i]=v,p[rs][v]++;
for(int i=ls+1;i<=rs-1;i++){
for(int j=1;j<=26;j++) p[i][j]=0;
p[i][v]=rm[i]-lm[i]+1,lazy[i]=v;}
return;}
inline void cnt(int l,int r){
if(r<l) return;
int ls=pos[l],rs=pos[r];
if(ls==rs){ pushdown(rs);
for(int i=l;i<=r;i++) t[a[i]]++;
return;} pushdown(ls),pushdown(rs);
for(int i=ls+1;i<=rs-1;i++){
if(lazy[i]) t[lazy[i]]+=rm[i]-lm[i]+1;
else for(int k=1;k<=26;k++) t[k]+=p[i][k];}
for(int i=l;i<=rm[ls];i++) t[a[i]]++;
for(int i=lm[rs];i<=r;i++) t[a[i]]++;
return;}
inline void Sort(int l,int r){ cnt(l,r);
int w=l; for(int i=1;i<=26;i++)
modifly(w,w+t[i]-1,i),w+=t[i],t[i]=0;
return;}
int main(){ n=read(),m=read(),key=sqrt(n);
string r; cin>>r;
for(int i=0;i<r.size();i++) a[i+1]=by(r[i]);
for(int i=1;i<=n;i++)
pos[i]=(i-1)/key+1,p[pos[i]][a[i]]++;
for(int i=1;i<=pos[n];i++) lm[i]=rm[i-1]+1,rm[i]=min(n,i*key);
while(m--){ op=read(),x=read(),y=read();
if(op==1) scanf("%s",u),cout<<query(x,y,by(u[0]))<<endl;
else if(op==2) scanf("%s",u),modifly(x,y,by(u[0]));
else Sort(x,y);
} return 0;
}
/*hack
in:
10 3
BABACCCAAC
3 3 9
3 5 10
1 1 7 A
out
4
*/