#include<stdio.h>
struct seg
{
int a,b,c; //a = div by three, b = remainder 1 c = remainder 2
}tree[1000000];
void create(int node, int left, int right)
{
if(left>right)
return;
if(left==right)
{
tree[node].a=1; //As at time of creation, initial value is zero, divisible by 3
tree[node].b=0;
tree[node].c=0;
return;
}
int mid=(left+right)/2;
create(2*node,left,mid);
create(2*node+1,mid+1,right);
tree[node].a=tree[2*node].a+tree[2*node+1].a;
tree[node].b=tree[2*node].b+tree[2*node+1].b;
tree[node].c=tree[2*node].c+tree[2*node+1].c;
}
int query(int node,int left, int right, int i, int j)
{
if(left>right)
return 0;
if(left>j || right<i)
return 0;
if(left >= i && right <= j)
return tree[node].a;
int mid=left+right;
mid/=2;
return query(2*node,left,mid,i,j)+query(2*node+1,mid+1,right,i,j);
}
void update(int node, int left, int right, int i, int j)
{
if(left>right)
return;
if(left>j || right<i)
return;
if(left >= i && right <= j)
{
int temp=tree[node].a;
tree[node].a=tree[node].b;
tree[node].b=tree[node].c;
tree[node].c=temp;
return;
}
int mid=left+right;
mid/=2;
update(2*node,left,mid,i,j);
update(2*node+1,mid+1,right,i,j);
}
int main()
{
int n,a,b,q,choice;
create(1,0,n-1);
while(q--)
{
scanf("%d%d%d",&choice
,&a
,&b
); if(choice)
{
printf("%d\n",query
(1,0,n
-1,a
+1,b
+1)); }
else
update(1,0,n-1,a+1,b+1);
}
}
I2luY2x1ZGU8c3RkaW8uaD4Kc3RydWN0IHNlZwp7CglpbnQgYSxiLGM7CQkvL2EgPSBkaXYgYnkgdGhyZWUsIGIgPSByZW1haW5kZXIgMSBjID0gcmVtYWluZGVyIDIKfXRyZWVbMTAwMDAwMF07CnZvaWQgY3JlYXRlKGludCBub2RlLCBpbnQgbGVmdCwgaW50IHJpZ2h0KQp7CglpZihsZWZ0PnJpZ2h0KQoJCXJldHVybjsKCWlmKGxlZnQ9PXJpZ2h0KQoJewoJCXRyZWVbbm9kZV0uYT0xOwkJLy9BcyBhdCB0aW1lIG9mIGNyZWF0aW9uLCBpbml0aWFsIHZhbHVlIGlzIHplcm8sIGRpdmlzaWJsZSBieSAzCgkJdHJlZVtub2RlXS5iPTA7CgkJdHJlZVtub2RlXS5jPTA7CgkJcmV0dXJuOwoJfQoJaW50IG1pZD0obGVmdCtyaWdodCkvMjsKCWNyZWF0ZSgyKm5vZGUsbGVmdCxtaWQpOwoJY3JlYXRlKDIqbm9kZSsxLG1pZCsxLHJpZ2h0KTsKCQoJdHJlZVtub2RlXS5hPXRyZWVbMipub2RlXS5hK3RyZWVbMipub2RlKzFdLmE7CQkKCXRyZWVbbm9kZV0uYj10cmVlWzIqbm9kZV0uYit0cmVlWzIqbm9kZSsxXS5iOwoJdHJlZVtub2RlXS5jPXRyZWVbMipub2RlXS5jK3RyZWVbMipub2RlKzFdLmM7Cn0KaW50IHF1ZXJ5KGludCBub2RlLGludCBsZWZ0LCBpbnQgcmlnaHQsIGludCBpLCBpbnQgaikKewoJaWYobGVmdD5yaWdodCkKCQlyZXR1cm4gMDsKCWlmKGxlZnQ+aiB8fCByaWdodDxpKQoJCXJldHVybiAwOwoJaWYobGVmdCA+PSBpICYmIHJpZ2h0IDw9IGopCgkJcmV0dXJuIHRyZWVbbm9kZV0uYTsKCWludCBtaWQ9bGVmdCtyaWdodDsKCW1pZC89MjsKCXJldHVybiBxdWVyeSgyKm5vZGUsbGVmdCxtaWQsaSxqKStxdWVyeSgyKm5vZGUrMSxtaWQrMSxyaWdodCxpLGopOwp9CnZvaWQgdXBkYXRlKGludCBub2RlLCBpbnQgbGVmdCwgaW50IHJpZ2h0LCBpbnQgaSwgaW50IGopCnsKCWlmKGxlZnQ+cmlnaHQpCgkJcmV0dXJuOwoJaWYobGVmdD5qIHx8IHJpZ2h0PGkpCgkJcmV0dXJuOwoJaWYobGVmdCA+PSBpICYmIHJpZ2h0IDw9IGopCgl7CgkJaW50IHRlbXA9dHJlZVtub2RlXS5hOwoJCXRyZWVbbm9kZV0uYT10cmVlW25vZGVdLmI7CgkJdHJlZVtub2RlXS5iPXRyZWVbbm9kZV0uYzsKCQl0cmVlW25vZGVdLmM9dGVtcDsKCQlyZXR1cm47Cgl9CglpbnQgbWlkPWxlZnQrcmlnaHQ7CgltaWQvPTI7Cgl1cGRhdGUoMipub2RlLGxlZnQsbWlkLGksaik7Cgl1cGRhdGUoMipub2RlKzEsbWlkKzEscmlnaHQsaSxqKTsKfQppbnQgbWFpbigpCnsKCWludCBuLGEsYixxLGNob2ljZTsKCXNjYW5mKCIlZCVkIiwmbiwmcSk7CgljcmVhdGUoMSwwLG4tMSk7Cgl3aGlsZShxLS0pCgl7CgkJc2NhbmYoIiVkJWQlZCIsJmNob2ljZSwmYSwmYik7CgkJaWYoY2hvaWNlKQoJCXsKCQkJcHJpbnRmKCIlZFxuIixxdWVyeSgxLDAsbi0xLGErMSxiKzEpKTsKCQl9CgkJZWxzZQoJCQl1cGRhdGUoMSwwLG4tMSxhKzEsYisxKTsKCX0KfQ==