#include<iostream> #include<vector> #include<cassert> #include<atcoder/segtree> using namespace std; struct dat{ int a,ab,abc,abcd,b,bc,bcd,c,cd,d; }; dat op(dat l,dat r) { dat ret; ret.a=l.a+r.a; ret.ab=min(l.a+r.ab,l.ab+r.b); ret.abc=min({l.a+r.abc,l.ab+r.bc,l.abc+r.c}); ret.abcd=min({l.a+r.abcd,l.ab+r.bcd,l.abc+r.cd,l.abcd+r.d}); ret.b=l.b+r.b; ret.bc=min(l.b+r.bc,l.bc+r.c); ret.bcd=min({l.b+r.bcd,l.bc+r.cd,l.bcd+r.d}); ret.c=l.c+r.c; ret.cd=min(l.c+r.cd,l.cd+r.d); ret.d=l.d+r.d; return ret; } dat e(){return(dat){};} dat INIT[4]; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); {//a dat v={}; v.b=v.bc=v.bcd=v.c=v.cd=v.d=1; v.a=v.ab=v.abc=v.abcd=0; INIT[0]=v; } {//b dat v={}; v.a=v.c=v.cd=v.d=1; v.b=v.ab=v.abc=v.abcd=v.bc=v.bcd=0; INIT[1]=v; } {//c dat v={}; v.a=v.ab=v.b=v.d=1; v.c=v.bc=v.abc=v.abcd=v.bcd=v.cd=0; INIT[2]=v; } {//d dat v={}; v.a=v.ab=v.abc=v.b=v.bc=v.c=1; v.abcd=v.bcd=v.cd=v.d=0; INIT[3]=v; } int N,Q; string S; cin>>N>>Q>>S; vector<dat>init(N); for(int i=0;i<N;i++)init[i]=INIT[S[i]-'A']; atcoder::segtree<dat,op,e>seg(init); for(;Q--;) { int OP;cin>>OP; if(OP==1) { int x;char c; cin>>x>>c; x--; seg.set(x,INIT[c-'A']); } else { int l,r;cin>>l>>r; dat t=seg.prod(l-1,r); cout<<t.abcd<<"\n"; } } }