#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int maxn = 1e5;
ll a[maxn+5],n,q;
struct segmentTree{
ll r[3] = {0,0,0};
ll lazy = 0;
};
segmentTree st[4*maxn+5];
void push_up(ll id) {
st[id].r[0] = st[2*id].r[0] + st[2*id+1].r[0];
st[id].r[1] = st[2*id].r[1] + st[2*id+1].r[1];
st[id].r[2] = st[2*id].r[2] + st[2*id+1].r[2];
}
void switch_state(ll id, ll k) {
ll val0 = st[id].r[0];
ll val1 = st[id].r[1];
ll val2 = st[id].r[2];
st[id].r[(0+k)%3] = val0;
st[id].r[(1+k)%3] = val1;
st[id].r[(2+k)%3] = val2;
}
void push_down(ll id) {
ll val = st[id].lazy;
switch_state(2*id,val);
switch_state(2*id+1,val);
st[2*id].lazy+=val;
st[2*id+1].lazy+=val;
st[id].lazy = 0;
}
void build(ll id, ll l, ll r) {
if(l == r) {
st[id].r[0] = (a[l] % 3 == 0);
st[id].r[1] = (a[l] % 3 == 1);
st[id].r[2] = (a[l] % 3 == 2);
return;
}
ll m = (l+r)/2;
build(2*id,l,m);
build(2*id+1,m+1,r);
push_up(id);
}
void update(ll id, ll l, ll r, ll u, ll v){
if(r < u || v < l || r < l || v < u) return;
if(u <= l && r <= v) {
switch_state(id,1);
st[id].lazy++;
return;
}
ll m = (l+r)/2;
push_down(id);
update(2*id,l,m,u,v);
update(2*id+1,m+1,r,u,v);
push_up(id);
}
ll get(ll id, ll l, ll r, ll u, ll v) {
if(r < u || v < l || r < l || v < u) return 0;
if(u <= l && r <= v) return st[id].r[0];
ll m = (l+r)/2;
push_down(id);
return get(2*id,l,m,u,v) + get(2*id+1,m+1,r,u,v);
}
void AC() {
cin >> n >> q;
for(int i = 1; i <= n; i++) cin >> a[i];
build(1,1,n);
while(q--) {
ll type,l,r; cin >> type >> l >> r;
if(type == 1) update(1,1,n,l,r);
else cout << get(1,1,n,l,r) << '\n';
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
AC();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIGxsID0gbG9uZyBsb25nOwpjb25zdCBpbnQgbWF4biA9IDFlNTsKbGwgYVttYXhuKzVdLG4scTsKc3RydWN0IHNlZ21lbnRUcmVlewogICAgbGwgclszXSA9IHswLDAsMH07CiAgICBsbCBsYXp5ID0gMDsKfTsKc2VnbWVudFRyZWUgc3RbNCptYXhuKzVdOwp2b2lkIHB1c2hfdXAobGwgaWQpIHsKICAgIHN0W2lkXS5yWzBdID0gc3RbMippZF0uclswXSArIHN0WzIqaWQrMV0uclswXTsKICAgIHN0W2lkXS5yWzFdID0gc3RbMippZF0uclsxXSArIHN0WzIqaWQrMV0uclsxXTsKICAgIHN0W2lkXS5yWzJdID0gc3RbMippZF0uclsyXSArIHN0WzIqaWQrMV0uclsyXTsKfQp2b2lkIHN3aXRjaF9zdGF0ZShsbCBpZCwgbGwgaykgewogICAgbGwgdmFsMCA9IHN0W2lkXS5yWzBdOwogICAgbGwgdmFsMSA9IHN0W2lkXS5yWzFdOwogICAgbGwgdmFsMiA9IHN0W2lkXS5yWzJdOwogICAgc3RbaWRdLnJbKDArayklM10gPSB2YWwwOwogICAgc3RbaWRdLnJbKDErayklM10gPSB2YWwxOwogICAgc3RbaWRdLnJbKDIrayklM10gPSB2YWwyOwp9CnZvaWQgcHVzaF9kb3duKGxsIGlkKSB7CiAgICBsbCB2YWwgPSBzdFtpZF0ubGF6eTsKICAgIHN3aXRjaF9zdGF0ZSgyKmlkLHZhbCk7CiAgICBzd2l0Y2hfc3RhdGUoMippZCsxLHZhbCk7CiAgICBzdFsyKmlkXS5sYXp5Kz12YWw7CiAgICBzdFsyKmlkKzFdLmxhenkrPXZhbDsKICAgIHN0W2lkXS5sYXp5ID0gMDsKfQp2b2lkIGJ1aWxkKGxsIGlkLCBsbCBsLCBsbCByKSB7CiAgICBpZihsID09IHIpIHsKICAgICAgICBzdFtpZF0uclswXSA9IChhW2xdICUgMyA9PSAwKTsKICAgICAgICBzdFtpZF0uclsxXSA9IChhW2xdICUgMyA9PSAxKTsKICAgICAgICBzdFtpZF0uclsyXSA9IChhW2xdICUgMyA9PSAyKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBsbCBtID0gKGwrcikvMjsKICAgIGJ1aWxkKDIqaWQsbCxtKTsKICAgIGJ1aWxkKDIqaWQrMSxtKzEscik7CiAgICBwdXNoX3VwKGlkKTsKfQp2b2lkIHVwZGF0ZShsbCBpZCwgbGwgbCwgbGwgciwgbGwgdSwgbGwgdil7CiAgICBpZihyIDwgdSB8fCB2IDwgbCB8fCByIDwgbCB8fCB2IDwgdSkgcmV0dXJuOwogICAgaWYodSA8PSBsICYmIHIgPD0gdikgewogICAgICAgIHN3aXRjaF9zdGF0ZShpZCwxKTsKICAgICAgICBzdFtpZF0ubGF6eSsrOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGxsIG0gPSAobCtyKS8yOwogICAgcHVzaF9kb3duKGlkKTsKICAgIHVwZGF0ZSgyKmlkLGwsbSx1LHYpOwogICAgdXBkYXRlKDIqaWQrMSxtKzEscix1LHYpOwogICAgcHVzaF91cChpZCk7Cn0KbGwgZ2V0KGxsIGlkLCBsbCBsLCBsbCByLCBsbCB1LCBsbCB2KSB7CiAgICBpZihyIDwgdSB8fCB2IDwgbCB8fCByIDwgbCB8fCB2IDwgdSkgcmV0dXJuIDA7CiAgICBpZih1IDw9IGwgJiYgciA8PSB2KSByZXR1cm4gc3RbaWRdLnJbMF07CiAgICBsbCBtID0gKGwrcikvMjsKICAgIHB1c2hfZG93bihpZCk7CiAgICByZXR1cm4gZ2V0KDIqaWQsbCxtLHUsdikgKyBnZXQoMippZCsxLG0rMSxyLHUsdik7Cn0Kdm9pZCBBQygpIHsKICAgIGNpbiA+PiBuID4+IHE7CiAgICBmb3IoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgY2luID4+IGFbaV07CiAgICBidWlsZCgxLDEsbik7CiAgICB3aGlsZShxLS0pIHsKICAgICAgICBsbCB0eXBlLGwscjsgY2luID4+IHR5cGUgPj4gbCA+PiByOwogICAgICAgIGlmKHR5cGUgPT0gMSkgdXBkYXRlKDEsMSxuLGwscik7CiAgICAgICAgZWxzZSBjb3V0IDw8IGdldCgxLDEsbixsLHIpIDw8ICdcbic7CiAgICB9Cn0KaW50IG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwogICAgQUMoKTsKICAgIHJldHVybiAwOwp9Cg==