代码如下:
#include <iostream>
#include <algorithm>
#include <cmath>
#define maxn 100005
using namespace std;
int n,m;
int a[maxn],w[maxn * 4];
int tag[maxn * 4];
void build(int u,int l,int r){
if(l == r)w[u] = 0;
else{
int mid = (l + r) / 2;
build(u * 2 ,l,mid);
build(u * 2 + 1,mid + 1,r);
w[u] = w[u * 2] + w[u * 2 + 1];
}
}
void maketag(int u,int l,int r){
w[u] = r - l + 1 - w[u];
tag[u] ^= 1;
}
void pushdown(int u,int l,int r){
int mid = (l + r) / 2;
maketag(u * 2,l,mid);
maketag(u * 2 + 1 ,mid + 1,r);
tag[u] = 0;
}
void update(int u,int L,int R,int l,int r){
if(l <= L && R <= r){
maketag(u,L,R);
}
else{
if(!(L > r || R < l)){
int mid = (L + R) / 2;
pushdown(u,L,R);
if(l <= mid)update(u * 2 ,L,mid,l,r);
if(r >= mid + 1)update(u * 2 + 1,mid + 1,R,l,r);
w[u] = w[u * 2] + w[u * 2 + 1];
}
}
//cout << u << " " << w[u] << endl;
}
int getsum(int u,int L,int R,int l,int r){
if(l <= L && R <= r){
return w[u];
}
else{
//pushdown(u,L,R);
if(!(L > r || R < l)){
int mid = (L + R) / 2;
pushdown(u,L,R);
return getsum(u * 2 ,L,mid,l,r) + getsum(u * 2 + 1,mid + 1,R,l,r);
}
else{
return 0;
}
}
}
int main()
{
cin >> n >> m;
build(1,1,n);
for(int i = 1 ; i <= m ; ++i){
int op,x,y;
cin >> op >> x >> y;
if(op == 0){
update(1,1,n,x,y);
}
else{
cout << getsum(1,1,n,x,y) << endl;
}
}
return 0;
}
样例输出为2 2,但是第一个我确实没查出来怎么错的