#pragma GCC optimize("O3,unroll-loops")
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define bp '\n'
#define vp cout<<'\n';
#define all(A) A.begin(),A.end()
using pii=pair<int,int>;
const int MOD=1e9+7;
const int MNLL=-1e18;
const int MXLL=1e18;
const int N=3e5+10;
struct segment{
vector<int>a;
int n;
segment(vector<int>&b):n(b.size()),a((int32_t)b.size()*4+10){
build(1,0,n-1,b);
}
void build(int pos,int l,int r,vector<int>&b){
if(l==r){
if(b[l]==1){
a[pos]=0;
}else{
a[pos]=MXLL;
}
return;
}
int mid=(l+r)/2;
build(pos*2,l,mid,b);
build(pos*2+1,mid+1,r,b);
a[pos]=max(a[pos*2],a[pos*2+1]);
}
void update(int pos,int l,int r,int point,int t){
//cout<<"-> "<<l<<' '<<r<<' '<<point<<'\n';
if(l==r){
if(l!=point)return;
if(a[pos]==MXLL){
a[pos]=t;
}else{
a[pos]=MXLL;
}
return;
}
if(l>point or r<point)return;
int mid=(l+r)/2;
update(pos*2,l,mid,point,t);
update(pos*2+1,mid+1,r,point,t);
a[pos]=max(a[pos*2],a[pos*2+1]);
}
int query(int pos,int l,int r,int ql,int qr){
if(l>qr or r<ql)return MNLL;
if(l>=ql and r<=qr){
return a[pos];
}
int mid=(l+r)/2;
return max(query(pos*2,l,mid,ql,qr),query(pos*2+1,mid+1,r,ql,qr));
}
};
signed main(){
cin.tie(nullptr)->sync_with_stdio(false);
int n,q,l,r,x;
cin>>n>>q;
vector<int>init;
string h;
cin>>h;
for(auto&e:h)init.emplace_back(e=='1');
segment a(init);
for(int i=1;i<=q;++i){
cin>>h;
if(h=="query"){
cin>>l>>r;
x=a.query(1,0,n-1,l-1,r-1);
if(x==MXLL)cout<<0;
else cout<<i-x;
vp
}else{
cin>>x;
a.update(1,0,n-1,x-1,i);
}
}
}
/*
5 7
11011
query 1 2
query 1 2
query 1 6
query 3 4
toggle 3
query 3 4
query 1 6
*/