This documentation is automatically generated by online-judge-tools/verification-helper
#define PROBLEM "https://judge.yosupo.jp/problem/predecessor_problem"
#include "wordsizetree"
#include "template"
int main() { IO();
int T=1;
// cin >> T;
while (T--) solve();
}
void solve() {
int n, q; cin >> n >> q;
vi a(n);
str st; cin >> st;
rep(i, n) if (st[i] == '1') a[i] = 1;
wordsizetree s(a);
while (q--) {
int x, y; cin >> x >> y;
if (x == 0) {
s.insert(y);
} elif (x == 1) {
s.erase(y);
} elif (x == 2) {
cout << s.count(y) << nl;
} elif (x == 3) {
int z = s.minright(y);
cout << (z<n ? z : -1) << nl;
} else {
int z = s.maxleft(y);
cout << (0<=z ? z : -1) << nl;
}
}
}
#line 1 "verify/yosupo-predecessor_problem.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/predecessor_problem"
#line 1 "structure/wordsizetree.hpp"
#include <bits/stdc++.h>
using namespace std;
struct wordsizetree{
int size;
vector<vector<unsigned long long>> a;
static int highbit(unsigned long long x){
if(x == 0) return 0;
return 63 - __builtin_clzll(x);
}
static int lowbit(unsigned long long x){
if(x == 0) return 64;
return __builtin_ctzll(x);
}
wordsizetree(int n){
size = n;
int t = n;
do {
vector<unsigned long long> b(t/64+1);
a.emplace_back(move(b));
t /= 64;
} while(t);
}
wordsizetree(vector<int> v) : wordsizetree(v.size()) {
for (int i=0; i<(int)v.size(); i++) {
if (v[i]) {
insert(i);
}
}
}
void insert(int x){
for(auto& a : a){
a[x/64] |= 1ULL << (x % 64);
x /= 64;
}
}
void erase(int x){
for(auto& a : a){
a[x/64] &= ~(1ULL << (x % 64));
if(a[x/64]) return;
x /= 64;
}
}
int count(int x) {
return (int)((a[0][x/64] >> (x%64)) & 1);
}
// x<=y となる最小のy を返す
int minright(int x) {
if(x < 0) x = 0;
if(size <= x) return size;
int d = 0, i = x;
while(true){
if(d >= (int)a.size()) return size;
if(i/64 >= (int)a[d].size()) return size;
unsigned long long m = a[d][i/64] & ((~(unsigned long long)0) << (i%64));
if(!m){d++; i/=64; i++;}
else{
int to = lowbit(m);
i = i/64*64 + to;
if(d == 0) break;
i *= 64;
d--;
}
}
return i;
}
// x<=y を満たす最小のy を返す
int maxleft(int x) {
if(x < 0) return -1;
if(size <= x) x = size-1;
int d = 0, i = x;
while(true){
if(i < 0) return -1;
if(d >= (int)a.size()) return -1;
unsigned long long m = a[d][i/64] & ~((~(unsigned long long)1) << (i%64));
if(!m){ d++; i /= 64; i--; }
else{
int to = highbit(m);
i = i/64*64 + to;
if(d == 0) break;
i *= 64;
i += 64-1;
d--;
}
}
return i;
}
};
#line 2 "util/template.hpp"
#ifdef poe
#define debug(x) cerr<<#x<<": "<<x<<endl
#else
#define debug(x)
// #pragma GCC target("arch=skylake-avx512")
// #pragma GCC target("avx2")
// #pragma GCC optimize("O3")
// #pragma GCC optimize("unroll-loops")
#endif
#line 12 "util/template.hpp"
using namespace std;
using ll=long long;
using ull=unsigned long long;
using ld=long double;
using pi=pair<int,int>;
using pll=pair<ll,ll>;
using str=string;
template<class T>using vec=vector<T>;
using vi=vec<int>;using vvi=vec<vi>;using vvvi=vec<vvi>;using vvvvi=vec<vvvi>;using vvvvvi=vec<vvvvi>;
using vll=vec<ll>;using vvll=vec<vll>;using vvvll=vec<vvll>;using vvvvll=vec<vvvll>;using vvvvvll=vec<vvvvll>;
using vpi=vec<pi>;using vvpi=vec<vpi>;using vvvpi=vec<vvpi>;using vvvvpi=vec<vvvpi>;using vvvvvpi=vec<vvvvpi>;
using vpll=vec<pll>;using vvpll=vec<vpll>;using vvvpll=vec<vvpll>;using vvvvpll=vec<vvvpll>;using vvvvvpll=vec<vvvvpll>;
template<class T>using pq=priority_queue<T,vector<T>>;
template<class T>using pqg=priority_queue<T,vector<T>,greater<T>>;
#define rep(i,n) for(int i=0;i<(int)(n);i++)
#define rep1(i,n) for(int i=1;i<=(int)(n);i++)
#define per(i,n) for(int i=(int)(n)-1;0<=i;i--)
#define per1(i,n) for(int i=(int)(n);0<i;i--)
#define range(i,x) for(auto&i:x)
#define range2(i,j,x) for(auto&[i,j]:x)
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define Sort(x) sort((x).begin(),(x).end())
#define troS(x) sort((x).rbegin(),(x).rend())
#define Reverse(x) reverse((x).begin(),(x).end())
#define uniq(x) sort((x).begin(),(x).end());(x).erase(unique((x).begin(),(x).end()),(x).end())
#define nextp(x) next_permutation((x).begin(),(x).end())
#define nextc(x,k) next_combination((x).begin(),(x).end(),k)
#define bit(x,i) (((x)>>(i))&1)
#define pf push_front
#define pb push_back
#define df pop_front
#define db pop_back
#define fi first
#define se second
#define elif else if
#define Yes cout<<"Yes"<<'\n'
#define No cout<<"No"<<'\n'
#define YN(x) cout<<((x)?"Yes":"No")<<'\n'
#define O(x) cout<<(x)<<'\n'
#define ismid(a,b,c) ((a)<=(b)&&(b)<(c))
template<class S,class T>bool chmin(S&a,T b){if(a>b){a=b;return true;}return false;}
template<class S,class T>bool chmax(S&a,T b){if(a<b){a=b;return true;}return false;}
template<class T>bool next_combination(T l,T r,int k){T m=l+k;if(l==r||l==m||r==m)return false;T t=m;while(l!=t){t--;if(*t<*(r-1)){T d=m;while(*t>=*d)d++;iter_swap(t,d);rotate(t+1,d+1,r);rotate(m,m+(r-d)-1,r);return true;}}rotate(l,m,r);return false;}
template<class T>T Min(T a,T b){return a<b?a:b;}
template<class T,class...Args>T Min(T a,T b,Args...args){return Min(Min(a,b),args...);}
template<class T>T Max(T a,T b){return a>b?a:b;}
template<class T,class...Args>T Max(T a,T b,Args...args){return Max(Max(a,b),args...);}
template<class T>T Sum(T a){return a;}
template<class T,class... Args>T Sum(T a,Args... args){return a+Sum(args...);}
template<class T>T Max(const vector<T>&v){return *max_element(all(v));}
template<class T>T Min(const vector<T>&v){return *min_element(all(v));}
template<class T>T Sum(const vector<T>&v){return accumulate(all(v),T(0));}
template<class S,class T>T Max(const pair<S,T>&p){return max(p.first,p.second);}
template<class S,class T>T Min(const pair<S,T>&p){return min(p.first,p.second);}
template<class S,class T>T Sum(const pair<S,T>&p){return p.first+p.second;}
template<class S,class T>istream&operator>>(istream&s,pair<S,T>&p){s>>p.first>>p.second;return s;}
template<class S,class T>ostream&operator<<(ostream&s,pair<S,T>&p){s<<p.first<<' '<<p.second<<'\n';return s;}
template<class T>istream&operator>>(istream&s,vector<T>&v){for(auto&i:v)s>>i;return s;}
template<class T>ostream&operator<<(ostream&s,vector<T>&v){for(auto&i:v)s<<i<<' ';s<<'\n';return s;}
template<class F>long long bsearch(long long ok,long long ng,F&f){while(abs(ok-ng)>1){long long mid=(ok+ng)/2;if(f(mid))ok=mid;else ng=mid;}return ok;}
const int dxy[5]={0,1,0,-1,0};
const int dx[8]={0,1,0,-1,1,1,-1,-1};
const int dy[8]={1,0,-1,0,1,-1,1,-1};
#define nl '\n'
#define sp ' '
#define inf ((1<<30)-(1<<15))
#define INF (1LL<<61)
#define mod 998244353
void IO() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout<<fixed<<setprecision(30);
}
void solve();
#line 4 "verify/yosupo-predecessor_problem.test.cpp"
int main() { IO();
int T=1;
// cin >> T;
while (T--) solve();
}
void solve() {
int n, q; cin >> n >> q;
vi a(n);
str st; cin >> st;
rep(i, n) if (st[i] == '1') a[i] = 1;
wordsizetree s(a);
while (q--) {
int x, y; cin >> x >> y;
if (x == 0) {
s.insert(y);
} elif (x == 1) {
s.erase(y);
} elif (x == 2) {
cout << s.count(y) << nl;
} elif (x == 3) {
int z = s.minright(y);
cout << (z<n ? z : -1) << nl;
} else {
int z = s.maxleft(y);
cout << (0<=z ? z : -1) << nl;
}
}
}