#include<cstdio>
#include<algorithm>
#include<set>
#include<iostream>
#define Chtholly_tree ct
#define Chtholly set<Chtholly_tree>::iterator
#define int long long
using namespace std;
struct Chtholly_tree{
int l,r;
mutable int val;
ct(int a=-1,int b=-1,int c=0){l=a,r=b,val=c;}
bool operator <(const Chtholly_tree &c)const{return l<c.l;}
};
int n,m;
char s[114514];
set<Chtholly_tree>st;
Chtholly split(int p){
Chtholly it=st.lower_bound(ct(p,0,0));
if(it!=st.end()&&it->l==p)return it;
it--;ct tmp=*it;st.erase(it);
st.insert(ct(tmp.l,p-1,tmp.val));
return st.insert(ct(p,tmp.r,tmp.val)).first;
}
void assign(int l,int r,int val){
Chtholly right=split(r+1),left=split(l);
st.erase(left,right);
st.insert({l,r,val});
}
int query(int l,int r,int k){
Chtholly right=split(r+1),left=split(l);
int ans=0;
for(;left!=right;left++)ans+=(left->r-left->l+1)*(left->val==k);
return ans;
}
void cntsort(int L,int R){
Chtholly r=split(R+1),l=split(L);
int c[26]={0};int pos=L;
for(Chtholly ll=l;ll!=r;ll++)c[ll->val]+=(ll->r)-(ll->l)+1;
st.erase(l,r);
for(int i=0;i<26;i++){
if(c[i]==0)continue;
st.insert(ct(pos,pos+c[i]-1,i)),pos+=c[i];
}
}
signed main(){
scanf("%lld%lld",&n,&m);
cin>>s+1;
for(int i=1;i<=n;i++)st.insert(ct(i,i,s[i]-'A'));
st.insert(ct(n+1,n+1,0));
while(m--){
int l,r,op;
char k;
scanf("%lld%lld%lld",&op,&l,&r);
if(op==1)cin>>k,printf("%lld\n",query(l,r,k-'A'));
if(op==2)cin>>k,assign(l,r,k-'A');
if(op==3)cntsort(l,r);
}
return 0;
}