#include<bits/stdc++.h>
#define ll long long
long long int tree[300000][3],lazy[300000],A[300000];
using namespace std;
void build(ll int node,ll int start,ll int end)
{
if(start == end)
{
tree[node][0] = 1, tree[node][1] = 0, tree[node][2] = 0;
}
else
{
int mid = (start + end) / 2;
// Recurse on the left child
build(2*node, start, mid);
// Recurse on the right child
build(2*node+1, mid+1, end);
// Internal node will have the sum of both of its children
tree[node][0] = tree[2*node][0] + tree[2*node+1][0];
tree[node][1] = tree[2*node][1] + tree[2*node+1][1];
tree[node][2] = tree[2*node][2] + tree[2*node+1][2];
}
}
void updateRange(ll int node,ll int start,ll int end,ll int l,ll int r)
{
if(lazy[node] != 0)
{
// This node needs to be updated
lazy[node]+=1;
if(start != end)
{
lazy[node*2]+=lazy[node]; // Mark child as lazy
lazy[node*2+1]+=lazy[node];
int rotate=lazy[node]%3;
for(ll int i=1;i<=rotate;i++)
{
ll int t1=tree[node*2][0];ll int t2=tree[node*2][1];ll int t3=tree[node*2][2];
tree[node*2][0]=t3;tree[node*2][1]=t1;tree[node*2][2]=t2;
}
for(ll int i=1;i<=rotate;i++)
{
ll int t1=tree[node*2+1][0];ll int t2=tree[node*2+1][1];ll int t3=tree[node*2+1][2];
tree[node*2+1][0]=t3;tree[node*2+1][1]=t1;tree[node*2+1][2]=t2;
}
}
lazy[node] = 0; // Reset it
}
if(start > end or start > r or end < l) // Current segment is not within range [l, r]
return ;
if(start >= l and end <= r)
{
// Segment is fully within range
//tree[node] = val;
//cout<<node<<" "<<tree[node][0]<<endl;
ll int t1=tree[node][0];ll int t2=tree[node][1];ll int t3=tree[node][2];
tree[node][0]=t3;tree[node][1]=t1;tree[node][2]=t2;
//cout<<node<<" "<<tree[node][0]<<endl;
if(start != end)
{
// Not leaf node
lazy[node*2]+=1;
lazy[node*2+1]+=1;
}
return;
}
ll int mid = (start + end) / 2;
updateRange(node*2, start, mid, l, r); // Updating left child
updateRange(node*2 + 1, mid + 1, end, l, r); // Updating right child
tree[node][0] = tree[2*node][0] + tree[2*node+1][0];
tree[node][1] = tree[2*node][1] + tree[2*node+1][1];
tree[node][2] = tree[2*node][2] + tree[2*node+1][2];
//cout<<node<<" "<<tree[node][0]<<endl;
}
ll int queryRange(ll int node,ll int start,ll int end,ll int l,ll int r)
{
if(start > end or start > r or end < l)
return 0; // Out of range
if(lazy[node] != 0)
{
// This node needs to be updated
lazy[node]+=1;
if(start != end)
{
lazy[node*2]+=lazy[node]; // Mark child as lazy
lazy[node*2+1]+=lazy[node];
ll int rotate=lazy[node]%3;
for(ll int i=1;i<=rotate;i++)
{
ll int t1=tree[node*2][0];ll int t2=tree[node*2][1];ll int t3=tree[node*2][2];
tree[node*2][0]=t3;tree[node*2][1]=t1;tree[node*2][2]=t2;
}
for(ll int i=1;i<=rotate;i++)
{
ll int t1=tree[node*2+1][0];ll int t2=tree[node*2+1][1];ll int t3=tree[node*2+1][2];
tree[node*2+1][0]=t3;tree[node*2+1][1]=t1;tree[node*2+1][2]=t2;
}
}
lazy[node] = 0; // Reset it
}
if(start >= l and end <= r) // Current segment is totally within range [l, r]
return tree[node][0];
ll int mid = (start + end) / 2;
ll int p1 = queryRange(node*2, start, mid, l, r); // Query left child
ll int p2 = queryRange(node*2 + 1, mid + 1, end, l, r); // Query right child
return p1 + p2;
}
int main()
{
ll int n,q,type,l,r,i;
scanf("%lld%lld",&n,&q);
build(1,1,n);
/*for(int i=1;i<=2*n;i++)
cout<<i<<" "<<tree[i][0]<<" "<<tree[i][1]<<" "<<tree[i][2]<<endl;*/
while(q--)
{
scanf("%lld",&type);
if(type){
scanf("%lld%lld",&l,&r);l++,r++;printf("%lld\n",queryRange(1,1,n,l,r));
}
else{
scanf("%lld%lld",&l,&r);l++,r++;updateRange(1,1,n,l,r);
}
}
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBsbCBsb25nIGxvbmcKbG9uZyBsb25nIGludCB0cmVlWzMwMDAwMF1bM10sbGF6eVszMDAwMDBdLEFbMzAwMDAwXTsKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdm9pZCBidWlsZChsbCBpbnQgbm9kZSxsbCBpbnQgc3RhcnQsbGwgaW50IGVuZCkKewogICAgaWYoc3RhcnQgPT0gZW5kKQogICAgewogICAgICAgIHRyZWVbbm9kZV1bMF0gPSAxLCB0cmVlW25vZGVdWzFdID0gMCwgdHJlZVtub2RlXVsyXSA9IDA7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaW50IG1pZCA9IChzdGFydCArIGVuZCkgLyAyOwogICAgICAgIC8vIFJlY3Vyc2Ugb24gdGhlIGxlZnQgY2hpbGQKICAgICAgICBidWlsZCgyKm5vZGUsIHN0YXJ0LCBtaWQpOwogICAgICAgIC8vIFJlY3Vyc2Ugb24gdGhlIHJpZ2h0IGNoaWxkCiAgICAgICAgYnVpbGQoMipub2RlKzEsIG1pZCsxLCBlbmQpOwogICAgICAgIC8vIEludGVybmFsIG5vZGUgd2lsbCBoYXZlIHRoZSBzdW0gb2YgYm90aCBvZiBpdHMgY2hpbGRyZW4KICAgICAgICB0cmVlW25vZGVdWzBdID0gdHJlZVsyKm5vZGVdWzBdICsgdHJlZVsyKm5vZGUrMV1bMF07CiAgICAgICAgdHJlZVtub2RlXVsxXSA9IHRyZWVbMipub2RlXVsxXSArIHRyZWVbMipub2RlKzFdWzFdOwogICAgICAgIHRyZWVbbm9kZV1bMl0gPSB0cmVlWzIqbm9kZV1bMl0gKyB0cmVlWzIqbm9kZSsxXVsyXTsKICAgIH0KfQp2b2lkIHVwZGF0ZVJhbmdlKGxsIGludCBub2RlLGxsIGludCBzdGFydCxsbCBpbnQgZW5kLGxsIGludCBsLGxsIGludCByKQp7CiAgICBpZihsYXp5W25vZGVdICE9IDApCiAgICB7CiAgICAgICAgLy8gVGhpcyBub2RlIG5lZWRzIHRvIGJlIHVwZGF0ZWQKICAgICAgICBsYXp5W25vZGVdKz0xOwogICAgICAgIGlmKHN0YXJ0ICE9IGVuZCkKICAgICAgICB7CiAgICAgICAgICAgIGxhenlbbm9kZSoyXSs9bGF6eVtub2RlXTsgICAgICAgLy8gTWFyayBjaGlsZCBhcyBsYXp5CiAgICAgICAgICAgIGxhenlbbm9kZSoyKzFdKz1sYXp5W25vZGVdOwogICAgICAgICAgICBpbnQgcm90YXRlPWxhenlbbm9kZV0lMzsKICAgICAgICAgICAgZm9yKGxsIGludCBpPTE7aTw9cm90YXRlO2krKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbGwgaW50IHQxPXRyZWVbbm9kZSoyXVswXTtsbCBpbnQgdDI9dHJlZVtub2RlKjJdWzFdO2xsIGludCB0Mz10cmVlW25vZGUqMl1bMl07CiAgICAgICAgICAgICAgICB0cmVlW25vZGUqMl1bMF09dDM7dHJlZVtub2RlKjJdWzFdPXQxO3RyZWVbbm9kZSoyXVsyXT10MjsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IobGwgaW50IGk9MTtpPD1yb3RhdGU7aSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsbCBpbnQgdDE9dHJlZVtub2RlKjIrMV1bMF07bGwgaW50IHQyPXRyZWVbbm9kZSoyKzFdWzFdO2xsIGludCB0Mz10cmVlW25vZGUqMisxXVsyXTsKICAgICAgICAgICAgICAgIHRyZWVbbm9kZSoyKzFdWzBdPXQzO3RyZWVbbm9kZSoyKzFdWzFdPXQxO3RyZWVbbm9kZSoyKzFdWzJdPXQyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxhenlbbm9kZV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCBpdAogICAgfQogICAgaWYoc3RhcnQgPiBlbmQgb3Igc3RhcnQgPiByIG9yIGVuZCA8IGwpICAgICAgICAgICAgICAvLyBDdXJyZW50IHNlZ21lbnQgaXMgbm90IHdpdGhpbiByYW5nZSBbbCwgcl0KICAgICAgICByZXR1cm4gOwogICAgaWYoc3RhcnQgPj0gbCBhbmQgZW5kIDw9IHIpCiAgICB7CiAgICAgICAgLy8gU2VnbWVudCBpcyBmdWxseSB3aXRoaW4gcmFuZ2UKICAgICAgICAvL3RyZWVbbm9kZV0gPSAgdmFsOwogICAgICAgIC8vY291dDw8bm9kZTw8IiAiPDx0cmVlW25vZGVdWzBdPDxlbmRsOwogICAgICAgIGxsIGludCB0MT10cmVlW25vZGVdWzBdO2xsIGludCB0Mj10cmVlW25vZGVdWzFdO2xsIGludCB0Mz10cmVlW25vZGVdWzJdOwogICAgICAgIHRyZWVbbm9kZV1bMF09dDM7dHJlZVtub2RlXVsxXT10MTt0cmVlW25vZGVdWzJdPXQyOwogICAgICAgIC8vY291dDw8bm9kZTw8IiAiPDx0cmVlW25vZGVdWzBdPDxlbmRsOwogICAgICAgIGlmKHN0YXJ0ICE9IGVuZCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIE5vdCBsZWFmIG5vZGUKICAgICAgICAgICAgbGF6eVtub2RlKjJdKz0xOwogICAgICAgICAgICBsYXp5W25vZGUqMisxXSs9MTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgbGwgaW50IG1pZCA9IChzdGFydCArIGVuZCkgLyAyOwogICAgdXBkYXRlUmFuZ2Uobm9kZSoyLCBzdGFydCwgbWlkLCBsLCByKTsgICAgICAgIC8vIFVwZGF0aW5nIGxlZnQgY2hpbGQKICAgIHVwZGF0ZVJhbmdlKG5vZGUqMiArIDEsIG1pZCArIDEsIGVuZCwgbCwgcik7ICAgLy8gVXBkYXRpbmcgcmlnaHQgY2hpbGQKICAgIHRyZWVbbm9kZV1bMF0gPSB0cmVlWzIqbm9kZV1bMF0gKyB0cmVlWzIqbm9kZSsxXVswXTsKICAgIHRyZWVbbm9kZV1bMV0gPSB0cmVlWzIqbm9kZV1bMV0gKyB0cmVlWzIqbm9kZSsxXVsxXTsKICAgIHRyZWVbbm9kZV1bMl0gPSB0cmVlWzIqbm9kZV1bMl0gKyB0cmVlWzIqbm9kZSsxXVsyXTsKICAgICAgICAgICAgLy9jb3V0PDxub2RlPDwiICI8PHRyZWVbbm9kZV1bMF08PGVuZGw7Cn0KbGwgaW50IHF1ZXJ5UmFuZ2UobGwgaW50IG5vZGUsbGwgaW50IHN0YXJ0LGxsIGludCBlbmQsbGwgaW50IGwsbGwgaW50IHIpCnsKICAgIGlmKHN0YXJ0ID4gZW5kIG9yIHN0YXJ0ID4gciBvciBlbmQgPCBsKQogICAgICAgIHJldHVybiAwOyAgICAgICAgIC8vIE91dCBvZiByYW5nZQogICAgaWYobGF6eVtub2RlXSAhPSAwKQogICAgewogICAgICAgIC8vIFRoaXMgbm9kZSBuZWVkcyB0byBiZSB1cGRhdGVkCiAgICAgICAgbGF6eVtub2RlXSs9MTsKICAgICAgICBpZihzdGFydCAhPSBlbmQpCiAgICAgICAgewogICAgICAgICAgICBsYXp5W25vZGUqMl0rPWxhenlbbm9kZV07ICAgICAgICAgICAgICAgICAgLy8gTWFyayBjaGlsZCBhcyBsYXp5CiAgICAgICAgICAgIGxhenlbbm9kZSoyKzFdKz1sYXp5W25vZGVdOwogICAgICAgICAgICBsbCBpbnQgcm90YXRlPWxhenlbbm9kZV0lMzsKICAgICAgICAgICAgZm9yKGxsIGludCBpPTE7aTw9cm90YXRlO2krKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbGwgaW50IHQxPXRyZWVbbm9kZSoyXVswXTtsbCBpbnQgdDI9dHJlZVtub2RlKjJdWzFdO2xsIGludCB0Mz10cmVlW25vZGUqMl1bMl07CiAgICAgICAgICAgICAgICB0cmVlW25vZGUqMl1bMF09dDM7dHJlZVtub2RlKjJdWzFdPXQxO3RyZWVbbm9kZSoyXVsyXT10MjsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IobGwgaW50IGk9MTtpPD1yb3RhdGU7aSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBsbCBpbnQgdDE9dHJlZVtub2RlKjIrMV1bMF07bGwgaW50IHQyPXRyZWVbbm9kZSoyKzFdWzFdO2xsIGludCB0Mz10cmVlW25vZGUqMisxXVsyXTsKICAgICAgICAgICAgICAgIHRyZWVbbm9kZSoyKzFdWzBdPXQzO3RyZWVbbm9kZSoyKzFdWzFdPXQxO3RyZWVbbm9kZSoyKzFdWzJdPXQyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxhenlbbm9kZV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXNldCBpdAogICAgfQogICAgaWYoc3RhcnQgPj0gbCBhbmQgZW5kIDw9IHIpICAgICAgICAgICAgIC8vIEN1cnJlbnQgc2VnbWVudCBpcyB0b3RhbGx5IHdpdGhpbiByYW5nZSBbbCwgcl0KICAgICAgICByZXR1cm4gdHJlZVtub2RlXVswXTsKICAgIGxsIGludCBtaWQgPSAoc3RhcnQgKyBlbmQpIC8gMjsKICAgIGxsIGludCBwMSA9IHF1ZXJ5UmFuZ2Uobm9kZSoyLCBzdGFydCwgbWlkLCBsLCByKTsgICAgICAgICAvLyBRdWVyeSBsZWZ0IGNoaWxkCiAgICBsbCBpbnQgcDIgPSBxdWVyeVJhbmdlKG5vZGUqMiArIDEsIG1pZCArIDEsIGVuZCwgbCwgcik7IC8vIFF1ZXJ5IHJpZ2h0IGNoaWxkCiAgICByZXR1cm4gcDEgKyBwMjsKfQppbnQgbWFpbigpCnsKICAgIGxsIGludCBuLHEsdHlwZSxsLHIsaTsKICAgIHNjYW5mKCIlbGxkJWxsZCIsJm4sJnEpOwogICAgYnVpbGQoMSwxLG4pOwogICAgLypmb3IoaW50IGk9MTtpPD0yKm47aSsrKQogICAgICAgIGNvdXQ8PGk8PCIgIjw8dHJlZVtpXVswXTw8IiAiPDx0cmVlW2ldWzFdPDwiICI8PHRyZWVbaV1bMl08PGVuZGw7Ki8KICAgIHdoaWxlKHEtLSkKICAgIHsKICAgICAgICBzY2FuZigiJWxsZCIsJnR5cGUpOwogICAgICAgIGlmKHR5cGUpewogICAgICAgICAgICBzY2FuZigiJWxsZCVsbGQiLCZsLCZyKTtsKysscisrO3ByaW50ZigiJWxsZFxuIixxdWVyeVJhbmdlKDEsMSxuLGwscikpOwogICAgICAgIH0KICAgICAgICBlbHNlewogICAgICAgICAgICBzY2FuZigiJWxsZCVsbGQiLCZsLCZyKTtsKysscisrO3VwZGF0ZVJhbmdlKDEsMSxuLGwscik7CiAgICAgICAgfQogICAgfQp9Cg==