样例过不了,感觉和平常写的线段树没啥区别,随便改个lazytag,结果没过样例。查了半天不知道哪里错了。
#include<bits/stdc++.h>
#define ls (x<<1)
#define rs (x<<1|1)
using namespace std;
int n,m,tag[1000009],sum[1000009];
void f(int x,int l,int r){
tag[x]^=1;
if(tag[x]) sum[x]=r-l+1-sum[x];
}
void pushdown(int x,int l,int r){
if(tag[x]){
int mid=(l+r)>>1;
f(ls,l,mid);
f(rs,mid+1,r);
tag[x]=0;
}
}
void pushup(int x){
sum[x]=sum[ls]+sum[rs];
}
void update(int x,int l,int r,int ql,int qr){
if(ql<=l&&qr>=r){
f(x,l,r);
return;
}
pushdown(x,l,r);
int mid=(l+r)>>1;
if(mid>=ql) update(ls,l,mid,ql,qr);
if(mid<qr) update(rs,mid+1,r,ql,qr);
pushup(x);
}
int query(int x,int l,int r,int ql,int qr){
if(ql<=l&&qr>=r) return sum[x];
pushdown(x,l,r);
int mid=(l+r)>>1,res=0;
if(mid>=ql) res+=query(ls,l,mid,ql,qr);
if(mid<qr) res+=query(rs,mid+1,r,ql,qr);
pushup(x);
return res;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int op,l,r;
cin>>op>>l>>r;
if(op==1) update(1,1,n,l,r);
else cout<<query(1,1,n,l,r)<<endl;
}
return 0;
}