rt, 0pt
/*
Contest: -
Problem: P5445
Author: tzc_wk
Time: 2020.7.18
*/
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define fz(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define foreach(it,v) for(__typeof(v.begin()) it=v.begin();it!=v.end();it++)
#define all(a) a.begin(),a.end()
#define fill0(a) memset(a,0,sizeof(a))
#define fill1(a) memset(a,-1,sizeof(a))
#define fillbig(a) memset(a,0x3f,sizeof(a))
#define fillsmall(a) memset(a,0xcf,sizeof(a))
#define y1 y1010101010101
#define y0 y0101010101010
typedef pair<int,int> pii;
inline int read(){
int x=0,neg=1;char c=getchar();
while(!isdigit(c)){
if(c=='-') neg=-1;
c=getchar();
}
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x*neg;
}
const int INF=0x3f3f3f3f;
int n=read(),T=read(),p=0,ans[1000005],x[1000005];
set<int> unable;
struct event{
int t,x,y,z;
} q[2000005],tmp[2000005];
void toggle(int x,int t){
int r=*unable.upper_bound(x),l=*--unable.lower_bound(x);
if(unable.count(x)) q[++p]={t,x,r,T-t},q[++p]={t,l-1,r,t-T},q[++p]={t,x,x,t-T},q[++p]={t,l-1,x,T-t},unable.erase(unable.find(x));
else q[++p]={t,x,r,t-T},q[++p]={t,l-1,r,T-t},q[++p]={t,x,x,T-t},q[++p]={t,l-1,x,t-T},unable.insert(x);
}
struct BIT{
int bit[2000005];
inline void add(int x,int v){
for(int i=x;i<=n+3;i+=(i&(-i))) bit[i]+=v;
}
inline int query(int x){
int sum=0;
for(int i=x;i;i-=(i&(-i))) sum+=bit[i];
return sum;
}
} t;
inline void merge(int l,int r,int mid){
int p1=l,p2=mid+1;
for(int i=l;i<=r;i++){
if(p1<=mid&&(p2>r||q[p1].x>q[p2].x))
tmp[i]=q[p1++];
else
tmp[i]=q[p2++];
}
for(int i=l;i<=r;i++){
q[i]=tmp[i];
}
}
inline void CDQ(int l,int r){
if(l==r) return;
int mid=(l+r)>>1;
CDQ(l,mid);CDQ(mid+1,r);
int cur=l;
fz(i,mid+1,r){
if(q[i].z!=INF) continue;
while(cur<=mid&&q[cur].x>=q[i].x){
if(q[cur].z!=INF) t.add(q[cur].y,q[cur].z);
cur++;
}
ans[q[i].t]+=t.query(n+3)-t.query(q[i].y-1);
// printf("%d\n",t.query(q[i].y));
}
fz(i,l,cur-1) if(q[i].z!=INF) t.add(q[i].y,-q[i].z);
merge(l,r,mid);
}
signed main(){
unable.insert(0);
unable.insert(n+1);
fz(i,1,n){
scanf("%1d",&x[i]);
unable.insert(i);
}
fz(i,1,n) if(x[i]) toggle(i,0);
fillbig(ans);
fz(i,1,T){
char opt[15];scanf("%s",opt+1);
if(opt[1]=='q'){
int l=read(),r=read();
q[++p]={i,l,r,INF};
int nxt=*unable.lower_bound(l);
if(nxt>r) ans[i]=-(T-i);
else ans[i]=0;
}
else{
int x=read();
toggle(x,i);
}
}
// fz(i,1,p) printf("%d %d %d %d\n",q[i].t,q[i].x,q[i].y,q[i].z);
CDQ(1,p);
fz(i,1,T) if(ans[i]!=INF) printf("%d\n",ans[i]);
return 0;
}