rt 萌新对着题解看了半天
#include<bits/stdc++.h>
#define lc(x) (x<<1)
#define rc(x) ((x<<1)|1)
using namespace std;
const int mxn=1e5;
int light[mxn<<2];
bool lazy_tag[mxn<<2];
inline void pushdown(int root,int left_range,int right_range)
{
if(lazy_tag[root])
{
lazy_tag[lc(root)]^=1;
lazy_tag[rc(root)]^=1;
int mid=(left_range+right_range)>>1;
light[lc(root)]=(mid-left_range+1)-light[lc(root)];
light[rc(root)]=(right_range-mid)-light[rc(root)];
lazy_tag[root]=0;
}
return;
}
inline void modify(int root,int left_range,int right_range,int start,int end)
{
if(start<=left_range && right_range<=end)
{
light[root]=(right_range-left_range+1)-light[root];
lazy_tag[root]^=1;
return;
}
pushdown(root,left_range,right_range);
int mid=(left_range+right_range)>>1;
if(start<=mid) modify(lc(root),left_range,mid,start,end);
if(mid<end) modify(rc(root),mid+1,right_range,start,end);
light[root]=light[lc(root)]+light[rc(root)];
}
inline int query(int root,int left_range,int right_range,int start,int end)
{
if(start<=left_range && right_range<=end)
return light[root];
pushdown(root,left_range,right_range);
int a=0,b=0,mid=(left_range+right_range)>>1;
if(start<=mid) a=query(lc(root),left_range,mid,start,end);
if(mid<end) b=query(rc(root),mid+1,right_range,start,end);
return a+b;
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int left_range,right_range;
bool op;
cin>>op>>left_range>>right_range;
if(!op)
modify(1,left_range,right_range,1,n);
else
cout<<query(1,left_range,right_range,1,n)<<endl;
}
return 0;
}
实在是不会调了