#include <bits/stdc++.h>
#define int long long
#define REP(i,a,b) for(int i = a; i<b; i++)
#define RREP(i,a,b) for(int i = a; i>b; i--)
#define pb push_back
using namespace std;
int n,q;
vector<int> tree,ans;
vector<bool> out;
void update(int i, int val){
for(; i<=n; i+=i&-i){
tree[i]+=val;
}
}
int query(int i){
int res = 0;
for(; i>0; i-=i&-i){
res+=tree[i];
}
return res;
}
struct node{
int x,y,val,id;
};
int INF = 1e18;
vector<node> qry;
vector<node> cdq(int l, int r){
if(l == r) return {qry[l]};
vector<node> curr1 = cdq(l, (l+r)/2);
vector<node> curr2 = cdq((l+r)/2+1, r);
vector<node> z;
int i = 0, j = 0;
while(i<curr1.size() && j<curr2.size()){
if(curr1[i].x <= curr2[j].x){
if(curr1[i].id == 1) update(curr1[i].y, curr1[i].val);
z.push_back(curr1[i]);
i++;
}
else{
if(curr2[j].id < 0) ans[-curr2[j].id] += query(n) - query(curr2[j].y-1);
z.push_back(curr2[j]);
j++;
}
}
while(i < curr1.size()){
if(curr1[i].id == 1) update(curr1[i].y, curr1[i].val);
z.push_back(curr1[i]);
i++;
}
while(j < curr2.size()){
if(curr2[j].id < 0) ans[-curr2[j].id] += query(n) - query(curr2[j].y-1);
z.push_back(curr2[j]);
j++;
}
REP(i,0,curr1.size()) if(curr1[i].id == 1) update(curr1[i].y, -curr1[i].val);
return z;
}
int32_t main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin>>n>>q;
ans.resize(q+1);
out.resize(q+1);
tree.resize(n+1,0);
string curr;
cin>>curr;
set<int> s;
s.insert(0);
REP(i,0,n){
if(curr[i] == '0') s.insert(i + 1);
}
s.insert(n+1);
int lst = 0,nxt;
for(int i: s){
if(lst+1<i) qry.pb({lst+1, i-1, 0, 1});
lst = i;
}
REP(j,1,q+1){
string type;
cin>>type;
if(type == "toggle"){
int i;
cin>>i;
if(curr[i-1] == '1'){
curr[i-1] = '0';
s.insert(i);
auto it = s.find(i);
lst = *prev(it);
nxt = *next(it);
qry.pb({lst+1,nxt-1,j,1});
if(lst<i-1) qry.pb({lst+1,i-1,-j,1});
if(i+1<nxt) qry.pb({i+1,nxt-1,-j,1});
}
else{
curr[i-1] = '1';
auto it = s.find(i);
lst = *prev(it);
nxt = *next(it);
if(lst<i-1)qry.pb({lst+1,i-1,j,1});
if(i+1<nxt)qry.pb({i+1,nxt-1,j,1});
qry.pb({lst+1,nxt-1,-j,1});
s.erase(it);
}
}
else{
int a,b;
cin>>a>>b;
if(*s.lower_bound(a)>b-1) ans[j] = j;
qry.pb({a, b-1, 0, -j});
out[j] = true;
}
}
cdq(0,qry.size()-1);
REP(i,1,q+1) if(out[i]) cout<<ans[i]<<"\n";
}