rt
lz很菜,连最简单的sgt都过不了(((
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<string>
#include<cmath>
#include<cstring>
#include<set>
#include<map>
#define ll long long
using namespace std;
const int N=100005;
struct sgt{
int l,r;
long long d,tag;
}t[4*N];
int getd(int p){
return t[p].r-t[p].l+1-t[p].d;
}
void pushdown(int p){
if(t[p].tag==1){
t[p*2].tag^=1,t[p*2+1].tag^=1;
t[p*2].d=getd(p*2);
t[p*2+1].d=getd(p*2+1);
t[p].tag=0;
}
}
void build(int p,int l,int r){
t[p].l=l,t[p].r=r;
if(l==r){
t[p].d=0,t[p].tag=0;
return ;
}
int mid=(l+r)>>1;
build(p*2,l,mid),build(p*2+1,mid+1,r);
t[p].d=t[p*2].d+t[p*2+1].d;
}
int query(int p,int l,int r){
if(t[p].l==l&&t[p].r==r){
return t[p].d;
}
int mid=(l+r)>>1;
pushdown(p);
if(r<=mid) return query(p*2,l,r);
else if(l>=mid+1) return query(p*2+1,l,r);
else return query(p*2,l,mid)+query(p*2+1,mid+1,r);
}
void change(int p,int l,int r){
cout<<p<<' '<<l<<' '<<r<<'\n';
if(t[p].l>=l&&t[p].r<=r){
t[p].tag^=1;
t[p].d=((t[p].r-t[p].l+1)-t[p].d);
return ;
}
int mid=(l+r)>>1;
pushdown(p);
if(mid>=l)change(p*2,l,r);
if(mid<r)change(p*2+1,l,r);
t[p].d=t[p*2].d+t[p*2+1].d;
}
int main(){
// freopen("test.in","r",stdin);
// freopen("test.out","w",stdout);
int n,m;
cin>>n>>m;
build(1,1,n);
while(m--){
int op,s,e;
cin>>op>>s>>e;
if(op==0) change(1,s,e);
else cout<<query(1,s,e)<<'\n';
}
return 0;
}