#include<iostream>
using namespace std;
const int MAX = 1e6;
// here 0 means all tails up
int sgtree[3*MAX] = {0},LazyTree[3*MAX] = {0};
//lazy query function
int LazyQuery(int stIndex,int b,int e,int qb,int qe){
// NO OVERLAP
if(qb>e || qe<b)return 0;
if(LazyTree[stIndex]==1){ //here one means Tree has pending Update
sgtree[stIndex] = (e-b+1) - sgtree[stIndex]; //new head = total length in interval - old head
if(b!=e){ //not a leaf node
LazyTree[2*stIndex+1] = 1 - LazyTree[2*stIndex+1];
LazyTree[2*stIndex+2] = 1 - LazyTree[2*stIndex+2];
}
LazyTree[stIndex] = 0;// putting it it previous form
}
//TOTAL OVERLAP
if(qb<=b && qe>=e)return sgtree[stIndex];
//PARTIAL OVERLAP
int x = LazyQuery(2*stIndex+1,b,(b+e)/2,qb,qe);
int y = LazyQuery(2*stIndex+2,(b+e)/2+1,e,qb,qe);
return x+y;
}
void LazyUpdate(int stIndex,int b,int e,int qb,int qe){
if(LazyTree[stIndex] == 1){ // taking care of old update
sgtree[stIndex] = (e-b+1) - sgtree[stIndex];
if(b!=e){
LazyTree[2*stIndex+1] = 1 - LazyTree[2*stIndex+1];
LazyTree[2*stIndex+1] = 1 - LazyTree[2*stIndex+2];
}
LazyTree[stIndex] = 0;
}
// NO OVERLAP
if(qb>e || qe <b)return ;
//TOTAL OVERLAP
if(b >= qb && e <= qe){
sgtree[stIndex] = (e-b+1)-sgtree[stIndex];
if(b!=e){
LazyTree[2*stIndex+1] = 1 - LazyTree[2*stIndex+1];
LazyTree[2*stIndex+2] = 1 - LazyTree[2*stIndex+2];
}
return;
}
//PARTIAL OVERLAP
LazyUpdate(2*stIndex+1,b,(b+e)/2,qb,qe);
LazyUpdate(2*stIndex+2,((b+e)/2)+1,e,qb,qe);
sgtree[stIndex] = sgtree[2*stIndex+1] + sgtree[2*stIndex+2];
}
int main(){
int n,q,x,y,i;
cin>>n>>q;
while(q--){
cin>>i;
if(i){
cin>>x>>y;
cout<<LazyQuery(0,0,n-1,x,y)<<endl;
}else{
cin>>x>>y;
LazyUpdate(0,0,n-1,x,y);
}
}
}
ICAgICNpbmNsdWRlPGlvc3RyZWFtPgogICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKICAgIGNvbnN0IGludCBNQVggPSAxZTY7CiAgICAgCiAgICAvLyBoZXJlIDAgbWVhbnMgYWxsIHRhaWxzIHVwCiAgICBpbnQgc2d0cmVlWzMqTUFYXSA9IHswfSxMYXp5VHJlZVszKk1BWF0gPSB7MH07CiAgICAgCiAgICAvL2xhenkgcXVlcnkgZnVuY3Rpb24KICAgIGludCBMYXp5UXVlcnkoaW50IHN0SW5kZXgsaW50IGIsaW50IGUsaW50IHFiLGludCBxZSl7CiAgICAgCiAgICAgICAgLy8gTk8gT1ZFUkxBUAogICAgICAgIGlmKHFiPmUgfHwgcWU8YilyZXR1cm4gMDsKICAgICAKICAgICAgICBpZihMYXp5VHJlZVtzdEluZGV4XT09MSl7ICAvL2hlcmUgb25lIG1lYW5zIFRyZWUgaGFzIHBlbmRpbmcgVXBkYXRlCiAgICAgICAgICAgIHNndHJlZVtzdEluZGV4XSA9IChlLWIrMSkgLSBzZ3RyZWVbc3RJbmRleF07IC8vbmV3IGhlYWQgPSB0b3RhbCBsZW5ndGggaW4gaW50ZXJ2YWwgLSBvbGQgaGVhZAogICAgICAgICAgICBpZihiIT1lKXsgLy9ub3QgYSBsZWFmIG5vZGUKICAgICAgICAgICAgICAgIExhenlUcmVlWzIqc3RJbmRleCsxXSA9IDEgLSBMYXp5VHJlZVsyKnN0SW5kZXgrMV07CiAgICAgICAgICAgICAgICBMYXp5VHJlZVsyKnN0SW5kZXgrMl0gPSAxIC0gTGF6eVRyZWVbMipzdEluZGV4KzJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIExhenlUcmVlW3N0SW5kZXhdID0gMDsvLyBwdXR0aW5nIGl0IGl0IHByZXZpb3VzIGZvcm0KICAgICAgICB9CiAgICAgCiAgICAgICAgLy9UT1RBTCBPVkVSTEFQCiAgICAgICAgaWYocWI8PWIgJiYgcWU+PWUpcmV0dXJuIHNndHJlZVtzdEluZGV4XTsKICAgICAKICAgICAgICAvL1BBUlRJQUwgT1ZFUkxBUAogICAgICAgIGludCB4ID0gTGF6eVF1ZXJ5KDIqc3RJbmRleCsxLGIsKGIrZSkvMixxYixxZSk7CiAgICAgICAgaW50IHkgPSBMYXp5UXVlcnkoMipzdEluZGV4KzIsKGIrZSkvMisxLGUscWIscWUpOwogICAgICAgIHJldHVybiB4K3k7CiAgICB9CiAgICAgCiAgICB2b2lkIExhenlVcGRhdGUoaW50IHN0SW5kZXgsaW50IGIsaW50IGUsaW50IHFiLGludCBxZSl7CiAgICAgCiAgICAgICAgaWYoTGF6eVRyZWVbc3RJbmRleF0gPT0gMSl7IC8vIHRha2luZyBjYXJlIG9mIG9sZCB1cGRhdGUKICAgICAgICAgICAgc2d0cmVlW3N0SW5kZXhdID0gKGUtYisxKSAtIHNndHJlZVtzdEluZGV4XTsKICAgICAKICAgICAgICAgICAgaWYoYiE9ZSl7CiAgICAgICAgICAgICAgICBMYXp5VHJlZVsyKnN0SW5kZXgrMV0gPSAxIC0gTGF6eVRyZWVbMipzdEluZGV4KzFdOwogICAgICAgICAgICAgICAgTGF6eVRyZWVbMipzdEluZGV4KzFdID0gMSAtIExhenlUcmVlWzIqc3RJbmRleCsyXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBMYXp5VHJlZVtzdEluZGV4XSA9IDA7CiAgICAgICAgfQogICAgICAgIC8vIE5PIE9WRVJMQVAKICAgICAgICBpZihxYj5lIHx8IHFlIDxiKXJldHVybiA7CiAgICAgCiAgICAgICAgLy9UT1RBTCBPVkVSTEFQCiAgICAgICAgaWYoYiA+PSBxYiAmJiBlIDw9IHFlKXsKICAgICAgICAgICAgc2d0cmVlW3N0SW5kZXhdID0gKGUtYisxKS1zZ3RyZWVbc3RJbmRleF07CiAgICAgICAgICAgIGlmKGIhPWUpewogICAgICAgICAgICAgICAgTGF6eVRyZWVbMipzdEluZGV4KzFdID0gMSAtIExhenlUcmVlWzIqc3RJbmRleCsxXTsKICAgICAgICAgICAgICAgIExhenlUcmVlWzIqc3RJbmRleCsyXSA9IDEgLSBMYXp5VHJlZVsyKnN0SW5kZXgrMl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAKICAgICAgICAvL1BBUlRJQUwgT1ZFUkxBUAogICAgICAgIExhenlVcGRhdGUoMipzdEluZGV4KzEsYiwoYitlKS8yLHFiLHFlKTsKICAgICAgICBMYXp5VXBkYXRlKDIqc3RJbmRleCsyLCgoYitlKS8yKSsxLGUscWIscWUpOwogICAgICAgIHNndHJlZVtzdEluZGV4XSA9IHNndHJlZVsyKnN0SW5kZXgrMV0gKyBzZ3RyZWVbMipzdEluZGV4KzJdOwogICAgfQogICAgIAogICAgIAogICAgIAogICAgaW50IG1haW4oKXsKICAgICAgICBpbnQgbixxLHgseSxpOwogICAgICAgIGNpbj4+bj4+cTsKICAgICAgICB3aGlsZShxLS0pewogICAgICAgICAgICBjaW4+Pmk7CiAgICAgICAgICAgIGlmKGkpewogICAgICAgICAgICAgICAgY2luPj54Pj55OwogICAgICAgICAgICAgICAgY291dDw8TGF6eVF1ZXJ5KDAsMCxuLTEseCx5KTw8ZW5kbDsKICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICBjaW4+Png+Pnk7CiAgICAgICAgICAgICAgICBMYXp5VXBkYXRlKDAsMCxuLTEseCx5KTsKICAgICAgICAgICAgfQogICAgIAogICAgICAgIH0KICAgICAKICAgIH0=