#include<bits/stdc++.h>
using namespace std;
const int MAXN=3e5+5;
struct upd { int l,r; };
struct query { int t,l,r,val,idx; };
bool comp(query a,query b)
{
if(a.idx==b.idx) return a.t<b.t;
return a.idx<b.idx;
}
namespace fen1
{
int fen[MAXN][2],pos[MAXN],cnt;
bool ck[MAXN];
void init()
{
cnt=0;
}
void update(int i,int n,int val)
{
for(int a=i;a<=n;a+=a&-a)
{
fen[a][0]+=val*(i-1),fen[a][1]+=val;
if(!ck[a]) pos[++cnt]=a,ck[a]=true;
}
}
int get(int i)
{
int ans=0;
for(int a=i;a;a-=a&-a) ans+=fen[a][1]*i-fen[a][0];
return ans;
}
void reset()
{
for(int i=1;i<=cnt;i++) ck[pos[i]]=false,fen[pos[i]][0]=fen[pos[i]][1]=0;
cnt=0;
}
}
namespace fen2
{
int fen[MAXN],ck[MAXN];
int getlog(long long n) { return 63-__builtin_clzll(n); }
void update(int i,int n,int val)
{
if(!(val-=ck[i])) return ;
ck[i]+=val;
for(;i<=n;i+=i&-i) fen[i]+=val;
}
int get(int i)
{
int ans=0;
for(;i;i-=i&-i) ans+=fen[i];
return ans;
}
int walk(int n,int val)
{
int ans=0;
for(int i=getlog(n);i+1;i--) if(ans+(1<<i)<=n&&val>=fen[ans+(1<<i)]) val-=fen[ans+=(1<<i)];
return ans+1;
}
}
namespace seg
{
int seg[MAXN*4];
void update(int l,int r,int u,int v,int val,int pos)
{
if(v<l||r<u) return ;
if(u<=l&&r<=v)
{
seg[pos]=val;
return ;
}
int mid=(l+r)/2;
if(seg[pos]) seg[pos*2]=seg[pos*2+1]=seg[pos],seg[pos]=0;
update(l,mid,u,v,val,pos*2);
update(mid+1,r,u,v,val,pos*2+1);
}
int get(int l,int r,int i,int pos)
{
while(l<r)
{
int mid=(l+r)/2;
if(seg[pos]) seg[pos*2]=seg[pos*2+1]=seg[pos],seg[pos]=0;
if(i<=mid) r=mid,pos*=2;
else l=mid+1,pos=pos*2+1;
}
return seg[pos];
}
}
int ans[MAXN],state[MAXN],T[MAXN];
vector<query> vq[MAXN];
vector< pair<int,int> > vi[MAXN];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,q;
string s;
cin>>n>>q>>s;
s=' '+s;
for(int i=1;i<=n;i++) T[i]=1,state[i]='1'-s[i];
for(int i=1;i<=q;i++)
{
string type;
cin>>type;
if(type=="query")
{
int a,b;
cin>>a>>b;
b--;
for(int p=a;p;p-=p&-p) vq[p].push_back({2,0,0,i,b});
}
else
{
int x;
cin>>x;
ans[i]=-1,state[x]^=1;
if(!state[x]) vi[x].push_back({T[x],i});
else T[x]=i+1;
}
}
fen1::init();
state[0]=T[0]=1;
for(int i=0;i<=n;i++)
{
if(state[i]) vi[i].push_back({T[i],q});
for(auto v:vi[i])
{
int pre=v.first,nex,res=fen2::get(v.first),val;
while(pre<=v.second)
{
nex=fen2::walk(q,res),val=seg::get(1,q,pre,1);
if(val) for(int a=val;a<=n+1;a+=a&-a) vq[a].push_back({1,pre,min(nex-1,v.second),-1,i});
if(nex<=v.second) fen2::update(nex,q,0);
pre=nex;
}
fen2::update(v.first,q,1);
fen2::update(v.second+1,q,1);
seg::update(1,q,v.first,v.second,i+1,1);
for(int a=i+1;a<=n+1;a+=a&-a) vq[a].push_back({1,v.first,v.second,1,i});
}
}
for(int i=1;i<=n+1;i++)
{
sort(vq[i].begin(),vq[i].end(),comp);
for(auto v:vq[i]) if(v.t==1)
{
fen1::update(v.l,q,v.val);
fen1::update(v.r+1,q,-v.val);
}
else ans[v.val]+=fen1::get(v.val);
fen1::reset();
}
for(int i=1;i<=q;i++) if(ans[i]!=-1) cout<<ans[i]<<"\n";
}