#include <bits/stdc++.h>
#define x first
#define y second
#define int long long
using namespace std;
using pii=pair<int,int>;
struct p{
int qu,x,y,time,cnt,idx;
}events[1500002];
int anst[300002],ans[300002],evc,n;
set<pii>st;
string s;
struct fen{
int tree[300002];
void update(int x, int val){
while(x<=n){
tree[x]+=val;
x+=x&-x;
}
}
int query(int x){
int ret=0;
while(x>0){
ret+=tree[x];
x-=x&-x;
}
return ret;
}
}sumf,cntf;
void cdq(int l,int r){
if(l>=r)return;
int mid=(l+r)/2;
cdq(l,mid);cdq(mid+1,r);
vector<p>vl,vr;
for(int i = l; i <= mid; i++){
if(events[i].qu==1)vl.push_back(events[i]);
}
for(int i = mid+1; i <= r; i++){
if(events[i].qu==2)vr.push_back(events[i]);
}
sort(vl.begin(),vl.end(),[](p &a,p &b){
return a.x<b.x;
});
sort(vr.begin(),vr.end(),[](p &a,p &b){
return a.x<b.x;
});
int idx=0;
for(auto &i:vr){
while(idx<vl.size()&&vl[idx].x<=i.x){
sumf.update(vl[idx].y,vl[idx].time*vl[idx].cnt);
cntf.update(vl[idx].y,vl[idx].cnt);
idx++;
}
ans[i.idx]+=sumf.query(n)-sumf.query(i.y-1);
anst[i.idx]+=cntf.query(n)-cntf.query(i.y-1);
}
for(int i = 0; i < idx; i++){
sumf.update(vl[i].y,-vl[i].time*vl[i].cnt);
cntf.update(vl[i].y,-vl[i].cnt);
}
}
int qn[300002];
signed main(){
ios::sync_with_stdio(0);cin.tie(0);
int q,cur=0,pos,x,y;
string t;
cin>>n>>q>>s;
for(int i = 0; i < n; i++){
if(s[i]=='1'){
if(cur==0){
cur=1;
pos=i+1;
}
}
else{
if(cur==1){
st.insert({pos,i});
events[evc++]={1,pos,i,0,1,0};
cur=0;
}
}
}
if(cur==1){
st.insert({pos,n});
events[evc++]={1,pos,n,0,1,0};
}
for(int i = 1; i <= q; i++){
cin>>t;
if(t=="query"){
cin>>x>>y;
y--;
events[evc++]={2,x,y,0,0,i};
qn[i]=1;
}
else{
cin>>x;
if(s[x-1]=='1'){
s[x-1]='0';
auto it=st.upper_bound({x,1e9});
it--;
int l=it->first,r=it->second;
st.erase(it);
events[evc++]={1,l,r,i,-1,0};
if(l<x){
st.insert({l,x-1});
events[evc++]={1,l,x-1,i,1,0};
}
if(x<r){
st.insert({x+1,r});
events[evc++]={1,x+1,r,i,1,0};
}
}
else{
s[x-1]='1';
auto rgt=st.lower_bound({x,0}),lft=rgt;
if(rgt!=st.begin())lft--;
if((lft==st.begin()||lft->second<x-1)&&(rgt==st.end()||rgt->first>x+1)){
st.insert({x,x});
events[evc++]={1,x,x,i,1,0};
continue;
}
if(rgt==st.begin()||lft->second<x-1){
int l=rgt->first,r=rgt->second;
events[evc++]={1,l,r,i,-1,0};
st.erase(rgt);
st.insert({x,r});
events[evc++]={1,x,r,i,1,0};
continue;
}
if(rgt==st.end()||rgt->first>x+1){
int l=lft->first,r=lft->second;
events[evc++]={1,l,r,i,-1,0};
st.erase(lft);
st.insert({l,x});
events[evc++]={1,l,x,i,1,0};
continue;
}
lft--;
int ll=lft->first,lr=lft->second,rl=rgt->first,rr=rgt->second;
st.erase(lft);st.erase(rgt);
events[evc++]={1,ll,lr,i,-1,0};
events[evc++]={1,rl,rr,i,-1,0};
st.insert({ll,rr});
events[evc++]={1,ll,rr,i,1,0};
}
qn[i]=0;
}
}
cdq(0,evc-1);
for(int i = 1; i <= q; i++){
if(qn[i])cout<<anst[i]*i-ans[i]<<'\n';
}
}