#include <iostream>
using namespace std;
int n,m;
struct tree
{
int flag,sum;
};
tree seg[500000];
int lazy[500000]={0};
void build_tree(int pos,int low,int high)
{
if(low==high)
{
seg[pos].flag=seg[pos].sum=0;
return;
}
int mid=(low+high)/2;
build_tree(2*pos+1,low,mid);
build_tree(2*pos+2,mid+1,high);
}
void update(int pos,int low,int high,int l,int r)
{
if(lazy[pos]==-1)
{
seg[pos].flag^=1;
seg[pos].sum=(high-low+1)*(seg[pos].flag);
if(low!=high)
{
lazy[2*pos+1]=-1;
lazy[2*pos+2]=-1;
}
lazy[pos]=0;
}
if(low>r||high<l)
return;
if(low>=l&&high<=r)
{
seg[pos].flag^=1;
seg[pos].sum=(high-low+1)*(seg[pos].flag);
if(low!=high)
{
lazy[2*pos+1]=-1;
lazy[2*pos+2]=-1;
}
return;
}
int mid=(low+high)/2;
update(2*pos+1,low,mid,l,r);
update(2*pos+2,mid+1,high,l,r);
seg[pos].flag=seg[2*pos+1].flag||seg[2*pos+2].flag;
seg[pos].sum=seg[2*pos+1].sum+seg[2*pos+2].sum;
}
int query(int pos,int low,int high,int l,int r)
{
if(low>r||high<l)
return 0;
if(lazy[pos]==-1)
{
seg[pos].flag^=1;
seg[pos].sum=(high-low+1)*(seg[pos].flag);
if(low!=high)
{
lazy[2*pos+1]=-1;
lazy[2*pos+2]=-1;
}
lazy[pos]=0;
}
if(low>=l&&high<=r)
return(seg[pos].sum);
int mid=(low+high)/2;
int p1=query(2*pos+1,low,mid,l,r);
int p2=query(2*pos+2,mid+1,high,l,r);
return (p1+p2);
}
int main()
{
cin>>n>>m;
int x,y,z;
build_tree(0,0,n-1);
while(m--)
{
cin>>x>>y>>z;
if(x==0)
{
update(0,0,n-1,y-1,z-1);
}
else
{
cout<<query(0,0,n-1,y-1,z-1)<<endl;
}
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBuLG07CgpzdHJ1Y3QgdHJlZQp7CiAgICBpbnQgZmxhZyxzdW07Cn07CnRyZWUgc2VnWzUwMDAwMF07CmludCBsYXp5WzUwMDAwMF09ezB9OwoKdm9pZCBidWlsZF90cmVlKGludCBwb3MsaW50IGxvdyxpbnQgaGlnaCkKewogICAgaWYobG93PT1oaWdoKQogICAgewogICAgICAgIHNlZ1twb3NdLmZsYWc9c2VnW3Bvc10uc3VtPTA7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaW50IG1pZD0obG93K2hpZ2gpLzI7CiAgICBidWlsZF90cmVlKDIqcG9zKzEsbG93LG1pZCk7CiAgICBidWlsZF90cmVlKDIqcG9zKzIsbWlkKzEsaGlnaCk7Cn0Kdm9pZCB1cGRhdGUoaW50IHBvcyxpbnQgbG93LGludCBoaWdoLGludCBsLGludCByKQp7CgogICAgaWYobGF6eVtwb3NdPT0tMSkKICAgIHsKICAgICAgICBzZWdbcG9zXS5mbGFnXj0xOwogICAgICAgIHNlZ1twb3NdLnN1bT0oaGlnaC1sb3crMSkqKHNlZ1twb3NdLmZsYWcpOwogICAgICAgIGlmKGxvdyE9aGlnaCkKICAgICAgICB7CiAgICAgICAgICAgIGxhenlbMipwb3MrMV09LTE7CiAgICAgICAgICAgIGxhenlbMipwb3MrMl09LTE7CiAgICAgICAgfQogICAgICAgIGxhenlbcG9zXT0wOwogICAgfQoKCiAgICBpZihsb3c+cnx8aGlnaDxsKQogICAgICAgIHJldHVybjsKCiAgICBpZihsb3c+PWwmJmhpZ2g8PXIpCiAgICB7CiAgICAgICAgc2VnW3Bvc10uZmxhZ149MTsKICAgICAgICBzZWdbcG9zXS5zdW09KGhpZ2gtbG93KzEpKihzZWdbcG9zXS5mbGFnKTsKICAgICAgICBpZihsb3chPWhpZ2gpCiAgICAgICAgewogICAgICAgICAgICBsYXp5WzIqcG9zKzFdPS0xOwogICAgICAgICAgICBsYXp5WzIqcG9zKzJdPS0xOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICB9CgogICAgaW50IG1pZD0obG93K2hpZ2gpLzI7CiAgICB1cGRhdGUoMipwb3MrMSxsb3csbWlkLGwscik7CiAgICB1cGRhdGUoMipwb3MrMixtaWQrMSxoaWdoLGwscik7CiAgICBzZWdbcG9zXS5mbGFnPXNlZ1syKnBvcysxXS5mbGFnfHxzZWdbMipwb3MrMl0uZmxhZzsKICAgIHNlZ1twb3NdLnN1bT1zZWdbMipwb3MrMV0uc3VtK3NlZ1syKnBvcysyXS5zdW07Cn0KCmludCBxdWVyeShpbnQgcG9zLGludCBsb3csaW50IGhpZ2gsaW50IGwsaW50IHIpCnsKICAgIGlmKGxvdz5yfHxoaWdoPGwpCiAgICAgICAgcmV0dXJuIDA7CiAgICBpZihsYXp5W3Bvc109PS0xKQogICAgewogICAgICAgIHNlZ1twb3NdLmZsYWdePTE7CiAgICAgICAgc2VnW3Bvc10uc3VtPShoaWdoLWxvdysxKSooc2VnW3Bvc10uZmxhZyk7CiAgICAgICAgaWYobG93IT1oaWdoKQogICAgICAgIHsKICAgICAgICAgICAgbGF6eVsyKnBvcysxXT0tMTsKICAgICAgICAgICAgbGF6eVsyKnBvcysyXT0tMTsKICAgICAgICB9CiAgICAgICAgbGF6eVtwb3NdPTA7CiAgICB9CiAgICBpZihsb3c+PWwmJmhpZ2g8PXIpCiAgICAgICAgcmV0dXJuKHNlZ1twb3NdLnN1bSk7CgogICAgaW50IG1pZD0obG93K2hpZ2gpLzI7CiAgICBpbnQgcDE9cXVlcnkoMipwb3MrMSxsb3csbWlkLGwscik7CiAgICBpbnQgcDI9cXVlcnkoMipwb3MrMixtaWQrMSxoaWdoLGwscik7CiAgICByZXR1cm4gKHAxK3AyKTsKfQppbnQgbWFpbigpCnsKCiAgIGNpbj4+bj4+bTsKICAgaW50IHgseSx6OwogICBidWlsZF90cmVlKDAsMCxuLTEpOwogICB3aGlsZShtLS0pCiAgIHsKICAgICAgICBjaW4+Png+Pnk+Pno7CiAgICAgICAgaWYoeD09MCkKICAgICAgICB7CiAgICAgICAgICAgIHVwZGF0ZSgwLDAsbi0xLHktMSx6LTEpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBjb3V0PDxxdWVyeSgwLDAsbi0xLHktMSx6LTEpPDxlbmRsOwogICAgICAgIH0KICAgfQp9Cg==