#include <bits/stdc++.h>
using namespace std;
#define mx 100009
struct Node {
int zero = 0, one = 0, two = 0, propChnage = 0;
};
Node tree[mx * 3];
Node merge(Node left, Node right) {
return {
left.zero + right.zero,
left.one + right.one,
left.two + right.two,
0,
};
}
void init(int node, int b, int e) {
// cout << "init\n";
if(b == e) {
tree[node] = {
.zero = 1,
};
return;
}
int left = node * 2;
int right = left + 1;
int mid = (b + e) / 2;
init(left, b, mid);
init(right, mid + 1, e);
tree[node] = merge(tree[left], tree[right]);
}
void printTree(int node, int b, int e) {
cout << b << ' ' << e <<
'[' << tree[node].zero << ' ' << tree[node].one << ' ' << tree[node].two << "] "
<< tree[node].propChnage << endl;
if(b == e) return;
int left = node * 2;
int right = left + 1;
int mid = (b + e) / 2;
printTree(left, b, mid);
printTree(right, mid + 1, e);
}
void update(int node, int b, int e, int i, int j) {
// cout << "update" << endl;
if(e < i || b > j) return;
if(b >= i && e <= j) {
tree[node].propChnage++;
tree[node].propChnage %= 3;
int tmp = tree[node].zero;
tree[node].zero = tree[node].two;
tree[node].two = tree[node].one;
tree[node].one = tmp;
return;
}
int left = node * 2;
int right = left + 1;
int mid = (b + e) / 2;
update(left, b, mid, i, j);
update(right, mid + 1, e, i, j);
tree[node] = merge(tree[left], tree[right]);
}
Node query(int node, int b, int e, int i, int j, int change) {
// cout << "query\n";
if(e < i || b > j) {
return {0, 0, 0, 0};
}
if(b >= i && e <= j) {
switch (change)
{
case 1: {
int tmp = tree[node].zero;
tree[node].zero = tree[node].two;
tree[node].two = tree[node].one;
tree[node].one = tmp;
break;
}
case 2: {
int tmp2 = tree[node].two;
tree[node].two = tree[node].zero;
int tmp1 = tree[node].one;
tree[node].one = tmp2;
tree[node].zero = tmp1;
break;
}
}
return tree[node];
}
int left = node * 2;
int right = left + 1;
int mid = (b + e) / 2;
return merge(query(left, b, mid, i, j, tree[node].propChnage + change), query(right, mid + 1, e, i, j, tree[node].propChnage + change));
tree[node].propChnage = 0;
}
int main() {
int n, q;
cin >> n >> q;
init(1, 1, n);
// printTree(1, 1, n);
while(q--) {
int qtype, i, j;
cin >> qtype >> i >> j;
i++, j++;
if(qtype == 0) update(1, 1, n, i, j);
else cout << query(1, 1, n, i, j, 0).zero << endl;
// printTree(1, 1, n);
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbXggMTAwMDA5CnN0cnVjdCBOb2RlIHsKICAgIGludCB6ZXJvID0gMCwgb25lID0gMCwgdHdvID0gMCwgcHJvcENobmFnZSA9IDA7Cn07Ck5vZGUgdHJlZVtteCAqIDNdOwpOb2RlIG1lcmdlKE5vZGUgbGVmdCwgTm9kZSByaWdodCkgewogICAgcmV0dXJuIHsKICAgICAgICBsZWZ0Lnplcm8gKyByaWdodC56ZXJvLAogICAgICAgIGxlZnQub25lICsgcmlnaHQub25lLAogICAgICAgIGxlZnQudHdvICsgcmlnaHQudHdvLAogICAgICAgIDAsCiAgICB9Owp9CnZvaWQgaW5pdChpbnQgbm9kZSwgaW50IGIsIGludCBlKSB7CiAgICAvLyBjb3V0IDw8ICJpbml0XG4iOwogICAgaWYoYiA9PSBlKSB7CiAgICAgICAgdHJlZVtub2RlXSA9IHsKICAgICAgICAgICAgLnplcm8gPSAxLAogICAgICAgIH07CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaW50IGxlZnQgPSBub2RlICogMjsKICAgIGludCByaWdodCA9IGxlZnQgKyAxOwogICAgaW50IG1pZCA9IChiICsgZSkgLyAyOwogICAgaW5pdChsZWZ0LCBiLCBtaWQpOwogICAgaW5pdChyaWdodCwgbWlkICsgMSwgZSk7CiAgICB0cmVlW25vZGVdID0gbWVyZ2UodHJlZVtsZWZ0XSwgdHJlZVtyaWdodF0pOwp9Cgp2b2lkIHByaW50VHJlZShpbnQgbm9kZSwgaW50IGIsIGludCBlKSB7CiAgICBjb3V0IDw8IGIgPDwgJyAnIDw8IGUgPDwgCiAgICAgICAgJ1snIDw8IHRyZWVbbm9kZV0uemVybyA8PCAnICcgPDwgdHJlZVtub2RlXS5vbmUgPDwgJyAnIDw8IHRyZWVbbm9kZV0udHdvIDw8ICJdICIgCiAgICAgICAgPDwgdHJlZVtub2RlXS5wcm9wQ2huYWdlIDw8IGVuZGw7CiAgICBpZihiID09IGUpIHJldHVybjsKICAgIGludCBsZWZ0ID0gbm9kZSAqIDI7CiAgICBpbnQgcmlnaHQgPSBsZWZ0ICsgMTsKICAgIGludCBtaWQgPSAoYiArIGUpIC8gMjsKICAgIHByaW50VHJlZShsZWZ0LCBiLCBtaWQpOwogICAgcHJpbnRUcmVlKHJpZ2h0LCBtaWQgKyAxLCBlKTsKfQoKdm9pZCB1cGRhdGUoaW50IG5vZGUsIGludCBiLCBpbnQgZSwgaW50IGksIGludCBqKSB7CiAgICAvLyBjb3V0IDw8ICJ1cGRhdGUiIDw8IGVuZGw7CiAgICBpZihlIDwgaSB8fCBiID4gaikgcmV0dXJuOwogICAgaWYoYiA+PSBpICYmIGUgPD0gaikgewogICAgICAgIHRyZWVbbm9kZV0ucHJvcENobmFnZSsrOwogICAgICAgIHRyZWVbbm9kZV0ucHJvcENobmFnZSAlPSAzOwoKICAgICAgICBpbnQgdG1wID0gdHJlZVtub2RlXS56ZXJvOwogICAgICAgIHRyZWVbbm9kZV0uemVybyA9IHRyZWVbbm9kZV0udHdvOwogICAgICAgIHRyZWVbbm9kZV0udHdvID0gdHJlZVtub2RlXS5vbmU7CiAgICAgICAgdHJlZVtub2RlXS5vbmUgPSB0bXA7CiAgICAgICAgICAgICAgIAogICAgICAgIAogICAgICAgIHJldHVybjsKICAgIH0KICAgIGludCBsZWZ0ID0gbm9kZSAqIDI7CiAgICBpbnQgcmlnaHQgPSBsZWZ0ICsgMTsKICAgIGludCBtaWQgPSAoYiArIGUpIC8gMjsKICAgIHVwZGF0ZShsZWZ0LCBiLCBtaWQsIGksIGopOwogICAgdXBkYXRlKHJpZ2h0LCBtaWQgKyAxLCBlLCBpLCBqKTsKICAgIHRyZWVbbm9kZV0gPSBtZXJnZSh0cmVlW2xlZnRdLCB0cmVlW3JpZ2h0XSk7Cn0KTm9kZSBxdWVyeShpbnQgbm9kZSwgaW50IGIsIGludCBlLCBpbnQgaSwgaW50IGosIGludCBjaGFuZ2UpIHsKICAgIC8vIGNvdXQgPDwgInF1ZXJ5XG4iOwogICAgaWYoZSA8IGkgfHwgYiA+IGopIHsKICAgICAgICByZXR1cm4gezAsIDAsIDAsIDB9OwogICAgfQogICAgaWYoYiA+PSBpICYmIGUgPD0gaikgewogICAgICAgIHN3aXRjaCAoY2hhbmdlKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAxOiB7CiAgICAgICAgICAgICAgICBpbnQgdG1wID0gdHJlZVtub2RlXS56ZXJvOwogICAgICAgICAgICAgICAgdHJlZVtub2RlXS56ZXJvID0gdHJlZVtub2RlXS50d287CiAgICAgICAgICAgICAgICB0cmVlW25vZGVdLnR3byA9IHRyZWVbbm9kZV0ub25lOwogICAgICAgICAgICAgICAgdHJlZVtub2RlXS5vbmUgPSB0bXA7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlIDI6IHsKICAgICAgICAgICAgICAgIGludCB0bXAyID0gdHJlZVtub2RlXS50d287CiAgICAgICAgICAgICAgICB0cmVlW25vZGVdLnR3byA9IHRyZWVbbm9kZV0uemVybzsKICAgICAgICAgICAgICAgIGludCB0bXAxID0gdHJlZVtub2RlXS5vbmU7CiAgICAgICAgICAgICAgICB0cmVlW25vZGVdLm9uZSA9IHRtcDI7CiAgICAgICAgICAgICAgICB0cmVlW25vZGVdLnplcm8gPSB0bXAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRyZWVbbm9kZV07CiAgICB9CiAgICBpbnQgbGVmdCA9IG5vZGUgKiAyOwogICAgaW50IHJpZ2h0ID0gbGVmdCArIDE7CiAgICBpbnQgbWlkID0gKGIgKyBlKSAvIDI7CiAgICByZXR1cm4gbWVyZ2UocXVlcnkobGVmdCwgYiwgbWlkLCBpLCBqLCB0cmVlW25vZGVdLnByb3BDaG5hZ2UgKyBjaGFuZ2UpLCBxdWVyeShyaWdodCwgbWlkICsgMSwgZSwgaSwgaiwgdHJlZVtub2RlXS5wcm9wQ2huYWdlICsgY2hhbmdlKSk7CiAgICB0cmVlW25vZGVdLnByb3BDaG5hZ2UgPSAwOwp9CmludCBtYWluKCkgewogICAgaW50IG4sIHE7CiAgICBjaW4gPj4gbiA+PiBxOwogICAgaW5pdCgxLCAxLCBuKTsKICAgIC8vIHByaW50VHJlZSgxLCAxLCBuKTsKICAgIHdoaWxlKHEtLSkgewogICAgICAgIGludCBxdHlwZSwgaSwgajsKICAgICAgICBjaW4gPj4gcXR5cGUgPj4gaSA+PiBqOwogICAgICAgIGkrKywgaisrOwogICAgICAgIGlmKHF0eXBlID09IDApIHVwZGF0ZSgxLCAxLCBuLCBpLCBqKTsKICAgICAgICBlbHNlIGNvdXQgPDwgcXVlcnkoMSwgMSwgbiwgaSwgaiwgMCkuemVybyA8PCBlbmRsOwogICAgICAgIC8vIHByaW50VHJlZSgxLCAxLCBuKTsKICAgIH0KICAgIHJldHVybiAwOwp9