#include <bits/stdc++.h>
using namespace std;
#define N 500009
#define ls (i << 1)
#define rs ((i << 1) | 1)
int n, q;
string s;
namespace xds{
struct V{
int l, r;
bool d;
int ld, rd, lazy;
inline V hb (const V a) {
V c;
c.l = l, c.r = a.r;
c.ld = ld, c.rd = a.rd;
c.d = d && a.d && (rd != a.ld);
return c;
}
}tree[(N << 2)];
inline void build(int i, int l, int r) {
tree[i].l = l, tree[i].r = r;
if(l == r) {
tree[i].ld = tree[i].rd = s[l] - '0';
tree[i].d = 1;
return;
}
int mid = (l + r) >> 1;
build(ls, l, mid);
build(rs, mid + 1, r);
tree[i] = tree[ls].hb(tree[rs]);
}
inline void pd(int i) {
tree[ls].ld ^= 1, tree[ls].rd ^= 1, tree[ls].lazy ^= 1;
tree[rs].ld ^= 1, tree[rs].rd ^= 1, tree[rs].lazy ^= 1;
tree[i].lazy ^= 1;
}
inline void op(int i, int l, int r) {
if(l <= tree[i].l && tree[i].r <= r) {
tree[i].ld ^= 1, tree[i].rd ^= 1;
tree[i].lazy ^= 1;
return;
}
if(tree[i].lazy) pd(i);
int mid = (tree[i].l + tree[i].r) >> 1;
if(l <= mid) op(ls, l, r);
if(mid < r) op(rs, l, r);
tree[i] = tree[ls].hb(tree[rs]);
}
inline V ask(int i, int l, int r) {
if(l <= tree[i].l && tree[i].r <= r) return tree[i];
if(tree[i].lazy) pd(i);
int mid = (tree[i].l + tree[i].r) >> 1;
if(l <= mid && mid < r) return ask(ls, l, r).hb(ask(rs, l, r));
if(l <= mid) return ask(ls, l, r);
return ask(rs, l, r);
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> q >> s;
s = " " + s;
xds::build(1, 1, n);
while(q--) {
int op, x, y;
cin >> op >> x >> y;
if(op == 1) xds::op(1, x, y);
else if(xds::ask(1, x, y).d) cout << "Yes\n";
else cout << "No\n";
if(op == 2) cout << xds::ask(1, x, y).d << "\n"; // (1)
}
return 0;
}
另外想问一下,本地跑加上(1),样例一可以输出正确答案(忽略输出的 0 或 1)。但不加上(1)时,却不能输出正确答案。