RT 这个程序本地(VSC)测试样例是对的,但到IDE上测样例会得到一个奇怪的59 求助是什么问题QWQ
#include <cstdio>
#define maxn 200005
struct node {
int lazy,lft,rgt,data;
node() {}
inline int len() { return rgt - lft + 1; }
inline int mid() { return rgt + lft >> 1; }
} t[maxn << 2];
int a[maxn],n,m;
inline int read() {
#define gc c = getchar()
int d = 0,f = 0,gc;
while(c < 48 || c > 57) f |= (c == '-'),gc;
while(c > 47 && c < 58) d = (d << 1) + (d << 3) + (c ^ 48),gc;
#undef gc
return f ? -d : d;
}
inline int ls(int p) { return p << 1; }
inline int rs(int p) { return p << 1 | 1; }
inline void push_up(int p) { t[p].data = t[ls(p)].data + t[rs(p)].data; }
inline void push_down(int p) {
if(t[p].lazy) {
t[ls(p)].lazy ^= 1;
t[rs(p)].lazy ^= 1;
t[ls(p)].data = t[ls(p)].len() - t[ls(p)].data;
t[rs(p)].data = t[rs(p)].len() - t[rs(p)].data;
t[p].lazy = 0;
}
}
void build(int p,int l,int r) {
t[p].lft = l,t[p].rgt = r;
if(l == r) { t[p].data = a[l]; return ; }
int mid = l + r >> 1;
build(ls(p),l,mid);
build(rs(p),mid + 1,r);
push_up(p);
}
void modify(int p,int l,int r) {
if(l <= t[p].lft && r >= t[p].rgt) {
t[p].data = t[p].len() - t[p].data;
t[p].lazy ^= 1;
return ;
}
push_down(p);
int mid = t[p].mid();
if(l <= mid) modify(ls(p),l,r);
if(r > mid) modify(rs(p),l,r);
push_up(p);
}
int query(int p,int l,int r) {
if(l <= t[p].lft && r >= t[p].rgt) return t[p].data;
push_down(p);
int mid = t[p].mid(),ans = 0;
if(l <= mid) ans += query(ls(p),l,r);
if(r > mid) ans += query(rs(p),l,r);
return ans;
}
int main() {
n = read(),m = read();
for(register int i = 1;i <= n;i ++) a[i] = getchar() ^ 48;
build(1,1,n);
for(;m;m --) {
register int op = read(),l = read(),r = read();
if(op == 0) modify(1,l,r);
if(op == 1) printf("%d\n",query(1,l,r));
}
return 0;
}