#include<bits/stdc++.h>
#define MAX 400000
using namespace std;
struct node
{
int rem1,rem2,data;
}tree[MAX];
int swap(int &a,int &b){ a = a+b; b = a-b; a = a-b;}
void init(int i,int start,int end)
{
if(start==end)
{
tree[i].data =1;
tree[i].rem1 =0;
tree[i].rem2 =0;
return;
}
int mid = (start+end)/2;
init(2*i,start,mid);
init(2*i+1,mid+1,end);
tree[i].data = tree[2*i].data + tree[2*i+1].data;
tree[i].rem1 = 0;
tree[i].rem2 = 0;
}
void update(int i,int start,int end,int qs,int qe)
{
if(qs>end||qe<start)
return;
if(qs<=start&&qe>=end)
{
swap(tree[i].data,tree[i].rem1);
swap(tree[i].data,tree[i].rem2);
return;
}
int mid = (start+end)/2;
update(2*i,start,mid,qs,qe);
update(2*i+1,mid+1,end,qs,qe);
tree[i].data = tree[2*i].data + tree[2*i+1].data;
tree[i].rem1 = tree[2*i].rem1 + tree[2*i+1].rem1;
tree[i].rem2 = tree[2*i].rem2 + tree[2*i+1].rem2;
}
int query(int i,int start,int end,int qs,int qe)
{
if(qs>end||qe<start)
return 0;
if(qs<=start&&qe>=end)
return tree[i].data;
int mid = (start+end)/2;
return query(2*i,start,mid,qs,qe) + query(2*i+1,mid+1,end,qs,qe);
}
int main()
{
int n,q,type,a,b;
scanf("%d%d",&n,&q);
init(1,0,n-1);
while(q--)
{
scanf("%d%d%d",&type,&a,&b);
if(type==0)
update(1,0,n-1,a,b);
else
printf("%d\n",query(1,0,n-1,a,b));
}
return 0;
}
ICAgICNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CiAgICAjZGVmaW5lIE1BWCA0MDAwMDAKICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAgICAgCiAgICBzdHJ1Y3Qgbm9kZQogICAgewogICAgaW50IHJlbTEscmVtMixkYXRhOwogICAgfXRyZWVbTUFYXTsKICAgICAKICAgIGludCBzd2FwKGludCAmYSxpbnQgJmIpeyBhID0gYStiOyBiID0gYS1iOyBhID0gYS1iO30KICAgICAKICAgIHZvaWQgaW5pdChpbnQgaSxpbnQgc3RhcnQsaW50IGVuZCkKICAgIHsKICAgIGlmKHN0YXJ0PT1lbmQpCiAgICB7CiAgICB0cmVlW2ldLmRhdGEgPTE7CiAgICB0cmVlW2ldLnJlbTEgPTA7CiAgICB0cmVlW2ldLnJlbTIgPTA7CiAgICByZXR1cm47CiAgICB9CiAgICAgCiAgICBpbnQgbWlkID0gKHN0YXJ0K2VuZCkvMjsKICAgIGluaXQoMippLHN0YXJ0LG1pZCk7CiAgICBpbml0KDIqaSsxLG1pZCsxLGVuZCk7CiAgICAgCiAgICB0cmVlW2ldLmRhdGEgPSB0cmVlWzIqaV0uZGF0YSArIHRyZWVbMippKzFdLmRhdGE7CiAgICB0cmVlW2ldLnJlbTEgPSAwOwogICAgdHJlZVtpXS5yZW0yID0gMDsKICAgIH0KICAgICAKICAgIHZvaWQgdXBkYXRlKGludCBpLGludCBzdGFydCxpbnQgZW5kLGludCBxcyxpbnQgcWUpCiAgICB7CiAgICBpZihxcz5lbmR8fHFlPHN0YXJ0KQogICAgcmV0dXJuOwogICAgIAogICAgaWYocXM8PXN0YXJ0JiZxZT49ZW5kKQogICAgewogICAgc3dhcCh0cmVlW2ldLmRhdGEsdHJlZVtpXS5yZW0xKTsKICAgIHN3YXAodHJlZVtpXS5kYXRhLHRyZWVbaV0ucmVtMik7CiAgICByZXR1cm47CiAgICB9CiAgICBpbnQgbWlkID0gKHN0YXJ0K2VuZCkvMjsKICAgIHVwZGF0ZSgyKmksc3RhcnQsbWlkLHFzLHFlKTsKICAgIHVwZGF0ZSgyKmkrMSxtaWQrMSxlbmQscXMscWUpOwogICAgIAogICAgdHJlZVtpXS5kYXRhID0gdHJlZVsyKmldLmRhdGEgKyB0cmVlWzIqaSsxXS5kYXRhOwogICAgdHJlZVtpXS5yZW0xID0gdHJlZVsyKmldLnJlbTEgKyB0cmVlWzIqaSsxXS5yZW0xOwogICAgdHJlZVtpXS5yZW0yID0gdHJlZVsyKmldLnJlbTIgKyB0cmVlWzIqaSsxXS5yZW0yOwogICAgfQogICAgIAogICAgaW50IHF1ZXJ5KGludCBpLGludCBzdGFydCxpbnQgZW5kLGludCBxcyxpbnQgcWUpCiAgICB7CiAgICBpZihxcz5lbmR8fHFlPHN0YXJ0KQogICAgcmV0dXJuIDA7CiAgICBpZihxczw9c3RhcnQmJnFlPj1lbmQpCiAgICByZXR1cm4gdHJlZVtpXS5kYXRhOwogICAgIAogICAgaW50IG1pZCA9IChzdGFydCtlbmQpLzI7CiAgICByZXR1cm4gcXVlcnkoMippLHN0YXJ0LG1pZCxxcyxxZSkgKyBxdWVyeSgyKmkrMSxtaWQrMSxlbmQscXMscWUpOwogICAgfQogICAgIAogICAgaW50IG1haW4oKQogICAgewogICAgaW50IG4scSx0eXBlLGEsYjsKICAgIHNjYW5mKCIlZCVkIiwmbiwmcSk7CiAgICBpbml0KDEsMCxuLTEpOwogICAgIAogICAgd2hpbGUocS0tKQogICAgewogICAgc2NhbmYoIiVkJWQlZCIsJnR5cGUsJmEsJmIpOwogICAgaWYodHlwZT09MCkKICAgIHVwZGF0ZSgxLDAsbi0xLGEsYik7CiAgICBlbHNlCiAgICBwcmludGYoIiVkXG4iLHF1ZXJ5KDEsMCxuLTEsYSxiKSk7CiAgICAgCiAgICB9CiAgICAgCiAgICByZXR1cm4gMDsKICAgIH0K