只能过#2求调
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+8;
#define ls (x<<1)
#define rs (x<<1|1)
struct Tree
{
int l,r;
int sum;
bool tag;
int nowon;
}tree[N<<2];
void pushdown(int x)
{
if(tree[x].tag)
{
tree[ls].nowon=tree[ls].sum-tree[ls].nowon;
tree[ls].tag^=1;
tree[rs].nowon=tree[rs].sum-tree[rs].nowon;
tree[rs].tag^=1;
tree[x].tag=0;
}
}
void buildtree(int x,int l,int r)
{
tree[x].l=l;
tree[x].r=r;
tree[x].sum=r-l+1;
tree[x].tag=0;
tree[x].nowon=r-l+1;
if(l==r) return;
int mid=(l+r)>>1;
buildtree(ls,l,mid);
buildtree(rs,mid+1,r);
//tree[x].nowon=tree[ls].nowon+tree[rs].nowon;
return ;
}
void edittree(int x,int l,int r)
{
if(l<=tree[x].l&&tree[x].r<=r)
{
tree[x].tag^=1;
tree[x].nowon=tree[x].sum-tree[x].nowon;
return ;
}
pushdown(x);
int mid=(tree[x].l+tree[x].r)/2;
if(mid>=l)
edittree(ls,l,r);
if(mid<r)
edittree(rs,l,r);
tree[x].nowon=tree[ls].nowon+tree[rs].nowon;
return;
}
int query(int x,int l,int r)
{
int ans=0;
if(l<=tree[x].l&&tree[x].r<=r)
{
return tree[x].nowon;
}
pushdown(x);
int mid=(tree[x].l+tree[x].r)>>1;
if(mid>=l)
ans=query(ls,l,r);
if(mid<r)
ans+=query(rs,l,r);
//tree[x].nowon=ans;
return ans;
}
int main()
{
int n,m;
cin>>n>>m;
int a,b,c;
buildtree(1,1,n);
for(int i=1;i<=m;i++)
{
cin>>c>>a>>b;
if(c==0)
{
edittree(1,a,b);
}
else if(c==1)
{
cout<<query(1,a,b)<<endl;
}
}
return 0;
}