#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);
seg[pos].flag=seg[pos].sum=0;
}
void update(int pos,int low,int high,int l,int r)
{
if(lazy[pos]!=0)
{
seg[pos].flag^=1;
if(lazy[pos]%2==1)
seg[pos].sum=(high-low+1)-seg[pos].sum;
if(low!=high)
{
lazy[2*pos+1]++;
lazy[2*pos+2]++;
}
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].sum;
if(low!=high)
{
lazy[2*pos+1]++;
lazy[2*pos+2]++;
}
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]!=0)
{
seg[pos].flag^=1;
if(lazy[pos]%2==1)
seg[pos].sum=(high-low+1)-seg[pos].sum;
if(low!=high)
{
lazy[2*pos+1]++;
lazy[2*pos+2]++;
}
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;
}
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgogCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKaW50IG4sbTsKIApzdHJ1Y3QgdHJlZQp7CiAgICBpbnQgZmxhZyxzdW07Cn07CnRyZWUgc2VnWzUwMDAwMF07CmludCBsYXp5WzUwMDAwMF09ezB9OwogCnZvaWQgYnVpbGRfdHJlZShpbnQgcG9zLGludCBsb3csaW50IGhpZ2gpCnsKICAgIGlmKGxvdz09aGlnaCkKICAgIHsKICAgICAgICBzZWdbcG9zXS5mbGFnPXNlZ1twb3NdLnN1bT0wOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGludCBtaWQ9KGxvdytoaWdoKS8yOwogICAgYnVpbGRfdHJlZSgyKnBvcysxLGxvdyxtaWQpOwogICAgYnVpbGRfdHJlZSgyKnBvcysyLG1pZCsxLGhpZ2gpOwogICAgc2VnW3Bvc10uZmxhZz1zZWdbcG9zXS5zdW09MDsKfQp2b2lkIHVwZGF0ZShpbnQgcG9zLGludCBsb3csaW50IGhpZ2gsaW50IGwsaW50IHIpCnsKIAogICAgaWYobGF6eVtwb3NdIT0wKQogICAgewogICAgICAgIHNlZ1twb3NdLmZsYWdePTE7CiAgICAgICAgaWYobGF6eVtwb3NdJTI9PTEpCiAgICAgICAgICAgIHNlZ1twb3NdLnN1bT0oaGlnaC1sb3crMSktc2VnW3Bvc10uc3VtOwogICAgICAgIGlmKGxvdyE9aGlnaCkKICAgICAgICB7CiAgICAgICAgICAgIGxhenlbMipwb3MrMV0rKzsKICAgICAgICAgICAgbGF6eVsyKnBvcysyXSsrOwogICAgICAgIH0KICAgICAgICBsYXp5W3Bvc109MDsKICAgIH0KIAogCiAgICBpZihsb3c+cnx8aGlnaDxsKQogICAgICAgIHJldHVybjsKIAogICAgaWYobG93Pj1sJiZoaWdoPD1yKQogICAgewogICAgICAgIHNlZ1twb3NdLmZsYWdePTE7CiAgICAgICAgc2VnW3Bvc10uc3VtPShoaWdoLWxvdysxKS1zZWdbcG9zXS5zdW07CiAgICAgICAgaWYobG93IT1oaWdoKQogICAgICAgIHsKICAgICAgICAgICAgbGF6eVsyKnBvcysxXSsrOwogICAgICAgICAgICBsYXp5WzIqcG9zKzJdKys7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgIH0KIAogICAgaW50IG1pZD0obG93K2hpZ2gpLzI7CiAgICB1cGRhdGUoMipwb3MrMSxsb3csbWlkLGwscik7CiAgICB1cGRhdGUoMipwb3MrMixtaWQrMSxoaWdoLGwscik7CiAgICBzZWdbcG9zXS5mbGFnPXNlZ1syKnBvcysxXS5mbGFnfHxzZWdbMipwb3MrMl0uZmxhZzsKICAgIHNlZ1twb3NdLnN1bT1zZWdbMipwb3MrMV0uc3VtK3NlZ1syKnBvcysyXS5zdW07Cn0KIAppbnQgcXVlcnkoaW50IHBvcyxpbnQgbG93LGludCBoaWdoLGludCBsLGludCByKQp7CiAgICBpZihsb3c+cnx8aGlnaDxsKQogICAgICAgIHJldHVybiAwOwogICAgaWYobGF6eVtwb3NdIT0wKQogICAgewogICAgICAgIHNlZ1twb3NdLmZsYWdePTE7CiAgICAgICAgaWYobGF6eVtwb3NdJTI9PTEpCiAgICAgICAgICAgIHNlZ1twb3NdLnN1bT0oaGlnaC1sb3crMSktc2VnW3Bvc10uc3VtOwogICAgICAgIGlmKGxvdyE9aGlnaCkKICAgICAgICB7CiAgICAgICAgICAgIGxhenlbMipwb3MrMV0rKzsKICAgICAgICAgICAgbGF6eVsyKnBvcysyXSsrOwogICAgICAgIH0KICAgICAgICBsYXp5W3Bvc109MDsKICAgIH0KICAgIGlmKGxvdz49bCYmaGlnaDw9cikKICAgICAgICByZXR1cm4oc2VnW3Bvc10uc3VtKTsKICAgIGludCBtaWQ9KGxvdytoaWdoKS8yOwogICAgaW50IHAxPXF1ZXJ5KDIqcG9zKzEsbG93LG1pZCxsLHIpOwogICAgaW50IHAyPXF1ZXJ5KDIqcG9zKzIsbWlkKzEsaGlnaCxsLHIpOwogICAgcmV0dXJuIChwMStwMik7Cn0KaW50IG1haW4oKQp7CiAKICAgY2luPj5uPj5tOwogICBpbnQgeCx5LHo7CiAgIGJ1aWxkX3RyZWUoMCwwLG4tMSk7CiAgIHdoaWxlKG0tLSkKICAgewogICAgICAgIGNpbj4+eD4+eT4+ejsKICAgICAgICBpZih4PT0wKQogICAgICAgIHsKICAgICAgICAgICAgdXBkYXRlKDAsMCxuLTEseS0xLHotMSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGNvdXQ8PHF1ZXJ5KDAsMCxuLTEseS0xLHotMSk8PGVuZGw7CiAgICAgICAgfQogICB9Cn0=