#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define scan_int(n) scanf("%d",&n)
#define scan_ll(n) scanf("%lld",&n)
#define m_p make_pair
#define p_b push_back
#define mx 100000
#define modu 1000000007
int seg[10000000];
int a[1000000];
int lazy[10000000];
void build(int left,int right ,int idx){
if(left==right){
seg[idx] = a[left];
return;
}
int mid = left+(right-left)/2;
build(left,mid,idx*2);
build(mid+1,right,idx*2+1);
seg[idx] = seg[idx*2]+seg[2*idx+1];
}
void update(int left,int right,int ql,int qr,int idx){
if(lazy[idx]){
//seg[idx] += lazy[idx]; <--- why commented this line,When it is used ?
if(lazy[idx]%2!=0){
seg[idx] = right-left+1-seg[idx];
}
if(left!=right){
lazy[idx*2] += lazy[idx];
lazy[idx*2+1] += lazy[idx];
}
lazy[idx] = 0;
}
if(ql>right||qr<left)
return ;
if(left>=ql&&right<=qr){
seg[idx] = right-left+1-seg[idx];
if(left!=right){
lazy[idx*2]++;
lazy[idx*2+1]++;
}
return;
}
int mid = left+(right-left)/2;
update(left,mid,ql,qr,idx*2);
update(mid+1,right,ql,qr,idx*2+1);
seg[idx] = seg[idx*2]+seg[idx*2+1];
}
int query(int left,int right,int ql,int qr,int idx){
if(lazy[idx]){
if(lazy[idx]%2!=0){
seg[idx] = right-left+1-seg[idx]; <----
}
if(left!=right){
lazy[idx*2] += lazy[idx];
lazy[idx*2+1] += lazy[idx];
}
lazy[idx] = 0;
}
if(ql>right||qr<left)
return 0;
if(ql<=left&&right<=qr){
return seg[idx];
}
int mid = left+(right-left)/2;
return query(left,mid,ql,qr,idx*2)+query(mid+1,right,ql,qr,idx*2+1);
}
int main()
{
int n,q,i;
scan_int(n);
scan_int(q);
for(i=0;i<n;i++){
a[i] = 0;
}
int task,l,r;
memset(lazy,0,sizeof(lazy));
while(q--){
scan_int(task);
scan_int(l);
scan_int(r);
if(task){
printf("%d\n",query(0,n-1,l,r,1));
}
else{
update(0,n-1,l,r,1);
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSBzY2FuX2ludChuKSBzY2FuZigiJWQiLCZuKQojZGVmaW5lIHNjYW5fbGwobikgc2NhbmYoIiVsbGQiLCZuKQojZGVmaW5lIG1fcCBtYWtlX3BhaXIKI2RlZmluZSBwX2IgcHVzaF9iYWNrCiNkZWZpbmUgbXggMTAwMDAwCiNkZWZpbmUgbW9kdSAxMDAwMDAwMDA3CiAKaW50IHNlZ1sxMDAwMDAwMF07CmludCBhWzEwMDAwMDBdOwppbnQgbGF6eVsxMDAwMDAwMF07CiAKdm9pZCBidWlsZChpbnQgbGVmdCxpbnQgcmlnaHQgLGludCBpZHgpewoJaWYobGVmdD09cmlnaHQpewoJCXNlZ1tpZHhdID0gYVtsZWZ0XTsKCQlyZXR1cm47Cgl9CglpbnQgbWlkID0gbGVmdCsocmlnaHQtbGVmdCkvMjsKCWJ1aWxkKGxlZnQsbWlkLGlkeCoyKTsKCWJ1aWxkKG1pZCsxLHJpZ2h0LGlkeCoyKzEpOwoJc2VnW2lkeF0gPSBzZWdbaWR4KjJdK3NlZ1syKmlkeCsxXTsKfQogCnZvaWQgdXBkYXRlKGludCBsZWZ0LGludCByaWdodCxpbnQgcWwsaW50IHFyLGludCBpZHgpewoJaWYobGF6eVtpZHhdKXsKCQkvL3NlZ1tpZHhdICs9IGxhenlbaWR4XTsgICAgICAgICAgICAgICAgICAgICAgPC0tLSB3aHkgY29tbWVudGVkIHRoaXMgbGluZSxXaGVuIGl0IGlzIHVzZWQgPwoJCWlmKGxhenlbaWR4XSUyIT0wKXsKCQkJc2VnW2lkeF0gPSByaWdodC1sZWZ0KzEtc2VnW2lkeF07CgkJfQoJCWlmKGxlZnQhPXJpZ2h0KXsKCQkJbGF6eVtpZHgqMl0gKz0gbGF6eVtpZHhdOwoJCQlsYXp5W2lkeCoyKzFdICs9IGxhenlbaWR4XTsKCQl9CgkJbGF6eVtpZHhdID0gMDsKCX0KCWlmKHFsPnJpZ2h0fHxxcjxsZWZ0KQoJCXJldHVybiA7CglpZihsZWZ0Pj1xbCYmcmlnaHQ8PXFyKXsKCQlzZWdbaWR4XSA9IHJpZ2h0LWxlZnQrMS1zZWdbaWR4XTsKCQlpZihsZWZ0IT1yaWdodCl7CgkJCWxhenlbaWR4KjJdKys7CgkJCWxhenlbaWR4KjIrMV0rKzsKCQl9CgkJcmV0dXJuOwoJfQoJaW50IG1pZCA9IGxlZnQrKHJpZ2h0LWxlZnQpLzI7Cgl1cGRhdGUobGVmdCxtaWQscWwscXIsaWR4KjIpOwoJdXBkYXRlKG1pZCsxLHJpZ2h0LHFsLHFyLGlkeCoyKzEpOwoJc2VnW2lkeF0gPSBzZWdbaWR4KjJdK3NlZ1tpZHgqMisxXTsKfQogCmludCBxdWVyeShpbnQgbGVmdCxpbnQgcmlnaHQsaW50IHFsLGludCBxcixpbnQgaWR4KXsKCWlmKGxhenlbaWR4XSl7CgkJaWYobGF6eVtpZHhdJTIhPTApewoJCQlzZWdbaWR4XSA9IHJpZ2h0LWxlZnQrMS1zZWdbaWR4XTsgICAgICAgICAgPC0tLS0KCQl9CgkJaWYobGVmdCE9cmlnaHQpewoJCQlsYXp5W2lkeCoyXSArPSBsYXp5W2lkeF07ICAgICAgICAgICAgICAgICAgCgkJCWxhenlbaWR4KjIrMV0gKz0gbGF6eVtpZHhdOwoJCX0KCQlsYXp5W2lkeF0gPSAwOwoJfQoJaWYocWw+cmlnaHR8fHFyPGxlZnQpCgkJcmV0dXJuIDA7CglpZihxbDw9bGVmdCYmcmlnaHQ8PXFyKXsKCQlyZXR1cm4gc2VnW2lkeF07Cgl9CglpbnQgbWlkID0gbGVmdCsocmlnaHQtbGVmdCkvMjsKCXJldHVybiBxdWVyeShsZWZ0LG1pZCxxbCxxcixpZHgqMikrcXVlcnkobWlkKzEscmlnaHQscWwscXIsaWR4KjIrMSk7Cn0KaW50IG1haW4oKQp7CglpbnQgbixxLGk7CglzY2FuX2ludChuKTsKCXNjYW5faW50KHEpOwoJZm9yKGk9MDtpPG47aSsrKXsKCQlhW2ldID0gMDsKCX0KCWludCB0YXNrLGwscjsKCW1lbXNldChsYXp5LDAsc2l6ZW9mKGxhenkpKTsKCXdoaWxlKHEtLSl7CgkJc2Nhbl9pbnQodGFzayk7CgkJc2Nhbl9pbnQobCk7CgkJc2Nhbl9pbnQocik7CgkJaWYodGFzayl7CgkJCXByaW50ZigiJWRcbiIscXVlcnkoMCxuLTEsbCxyLDEpKTsKCQl9CgkJZWxzZXsKCQkJdXBkYXRlKDAsbi0xLGwsciwxKTsKCQl9Cgl9CglyZXR1cm4gMDsKfQ==