#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5,M=1e3+5;
int n,q;
int len,tot,L[M],R[M],bel[N];
bool a[N],d[M],lazy[M];
bool T(int p)
{
return a[p]!=lazy[bel[p]];
}
bool Nice(int l,int r)
{
if(l==r) return 1;
bool f=1;
for(int i=l;i<r;i++)
if(T(i)==T(i+1))
{
f=0;
break;
}
return f;
}
void Build()
{
len=sqrt(n);
tot=n/len;
if(n%len!=0) tot++;
for(int i=1;i<=tot;i++) L[i]=(i-1)*len+1,R[i]=i*len;
R[tot]=n;
for(int i=1;i<=n;i++) bel[i]=(i-1)/len+1;
for(int i=1;i<=tot;i++) d[i]=Nice(L[i],R[i]);
}
void Update(int l,int r)
{
int x=bel[l],y=bel[r];
if(x==y)
{
for(int i=l;i<=r;i++) a[i]=!a[i];
d[x]=Nice(L[x],R[x]);
}
for(int i=l;i<=R[x];i++) a[i]=!a[i];
for(int i=L[y];i<=r;i++) a[i]=!a[i];
for(int i=x+1;i<y;i++) lazy[i]=!lazy[i];
d[x]=Nice(L[x],R[x]);
d[y]=Nice(L[y],R[y]);
}
bool Query(int l,int r)
{
int x=bel[l],y=bel[r];
if(x==y) return Nice(l,r);
if(T(L[x+1])==T(R[x])||T(R[y-1])==T(L[y])) return 0;
for(int i=x+1;i<y-1;i++)
if(d[i]==0||d[i+1]==0||T(R[i])==T(L[i+1]))
return 0;
if(Nice(l,R[x])&&Nice(L[y],r)) return 1;
else return 0;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>q;
for(int i=1;i<=n;i++)
{
char c;
cin>>c;
a[i]=c-'0';
}
Build();
while(q--)
{
int index,l,r;
cin>>index>>l>>r;
if(index==1) Update(l,r);
else if(Query(l,r)) cout<<"Yes\n";
else cout<<"No\n";
}
return 0;
}
AC23个,WA19个