/* AUTHOR: TUAN ANH - BUI */
// ~~ icebear ~~
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int, int> ii;
typedef pair<int, ii> iii;
template<class X, class Y>
bool minimize(X &x, const Y &y) {
if (x > y) return x = y, true;
return false;
}
template<class X, class Y>
bool maximize(X &x, const Y &y) {
if (x < y) return x = y, true;
return false;
}
#define FOR(i,a,b) for(int i=(a); i<=(b); ++i)
#define FORR(i,a,b) for(int i=(a); i>=(b); --i)
#define REP(i, n) for(int i=0; i<(n); ++i)
#define RED(i, n) for(int i=(n)-1; i>=0; --i)
#define MASK(i) (1LL << (i))
#define BIT(S, i) (((S) >> (i)) & 1)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define all(x) x.begin(), x.end()
#define task "icebear"
/*END OF TEMPLATE. ICEBEAR AND THE CAT WILL WIN VOI26 */
const int MOD = 1e3 + 7;
const int inf = (int)1e9 + 27092008;
const ll INF = (ll)1e18 + 27092008;
const int N = 2e5 + 5;
int n, q, node[N << 2], lazy[N << 2];
int fibo[N], sta, len;
map<ii, int> last;
vector<int> fib;
int calcFibo(int K) {
if (K < N) return fibo[K];
return fib[(K - sta) % len];
}
void pushDown(int id, int l, int r) {
if (lazy[id]) {
int mid = (l + r) >> 1;
node[id << 1] += lazy[id] * (mid - l + 1);
node[id << 1 | 1] += lazy[id] * (r - mid);
lazy[id << 1] += lazy[id];
lazy[id << 1 | 1] += lazy[id];
lazy[id] = 0;
}
}
void update(int id, int l, int r, int u, int v, int k) {
if (l > v || r < u) return;
if (u <= l && r <= v) {
node[id] += (r - l + 1) * k;
lazy[id] += k;
return;
}
pushDown(id, l, r);
int mid = (l + r) >> 1;
update(id << 1, l, mid, u, v, k);
update(id << 1 | 1, mid + 1, r, u, v, k);
node[id] = node[id << 1] + node[id << 1 | 1];
}
int get(int id, int l, int r, int u, int v) {
if (l > v || r < u) return 0;
if (u <= l && r <= v) return node[id];
pushDown(id, l, r);
int mid = (l + r) >> 1;
return get(id << 1, l, mid, u, v) + get(id << 1 | 1, mid + 1, r, u, v);
}
void init(void) {
cin >> n >> q;
fibo[1] = fibo[2] = 1;
FOR(i, 3, N - 5) fibo[i] = (fibo[i - 1] + fibo[i - 2]) % MOD;
}
void process(void) {
FOR(i, 2, N - 5) {
if (last.find({fibo[i-1], fibo[i]}) != last.end()) {
sta = last[{fibo[i-1], fibo[i]}];
break;
}
last[{fibo[i-1], fibo[i]}] = i;
}
int a = fibo[sta - 1];
int b = fibo[sta];
fib.pb(fibo[sta]);
for(int i = sta + 1; fibo[i] != b || fibo[i - 1] != a; i++) {
fib.pb(fibo[i]);
}
len = (int)fib.size();
while(q--) {
int type; cin >> type;
if (type == 1) {
int l, r, k;
cin >> l >> r >> k;
update(1, 1, n, l, r, calcFibo(k));
} else {
int l, r;
cin >> l >> r;
cout << get(1, 1, n, l, r) << '\n';
}
}
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
if (fopen(task".inp", "r")) {
freopen(task".inp", "r", stdin);
freopen(task".out", "w", stdout);
}
int tc = 1;
// cin >> tc;
while(tc--) {
init();
process();
}
return 0;
}
LyogQVVUSE9SOiBUVUFOIEFOSCAtIEJVSSAqLwovLyB+fiBpY2ViZWFyIH5+CiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIGludCBsb25nIGxvbmcKdHlwZWRlZiBsb25nIGxvbmcgbGw7CnR5cGVkZWYgcGFpcjxpbnQsIGludD4gaWk7CnR5cGVkZWYgcGFpcjxpbnQsIGlpPiBpaWk7Cgp0ZW1wbGF0ZTxjbGFzcyBYLCBjbGFzcyBZPgogICAgYm9vbCBtaW5pbWl6ZShYICZ4LCBjb25zdCBZICZ5KSB7CiAgICAgICAgaWYgKHggPiB5KSByZXR1cm4geCA9IHksIHRydWU7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKdGVtcGxhdGU8Y2xhc3MgWCwgY2xhc3MgWT4KICAgIGJvb2wgbWF4aW1pemUoWCAmeCwgY29uc3QgWSAmeSkgewogICAgICAgIGlmICh4IDwgeSkgcmV0dXJuIHggPSB5LCB0cnVlOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiNkZWZpbmUgRk9SKGksYSxiKSBmb3IoaW50IGk9KGEpOyBpPD0oYik7ICsraSkKI2RlZmluZSBGT1JSKGksYSxiKSBmb3IoaW50IGk9KGEpOyBpPj0oYik7IC0taSkKI2RlZmluZSBSRVAoaSwgbikgZm9yKGludCBpPTA7IGk8KG4pOyArK2kpCiNkZWZpbmUgUkVEKGksIG4pIGZvcihpbnQgaT0obiktMTsgaT49MDsgLS1pKQojZGVmaW5lIE1BU0soaSkgKDFMTCA8PCAoaSkpCiNkZWZpbmUgQklUKFMsIGkpICgoKFMpID4+IChpKSkgJiAxKQojZGVmaW5lIG1wIG1ha2VfcGFpcgojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgYWxsKHgpIHguYmVnaW4oKSwgeC5lbmQoKQojZGVmaW5lIHRhc2sgImljZWJlYXIiCi8qRU5EIE9GIFRFTVBMQVRFLiBJQ0VCRUFSIEFORCBUSEUgQ0FUIFdJTEwgV0lOIFZPSTI2ICovCgpjb25zdCBpbnQgTU9EID0gMWUzICsgNzsKY29uc3QgaW50IGluZiA9IChpbnQpMWU5ICsgMjcwOTIwMDg7CmNvbnN0IGxsIElORiAgPSAobGwpMWUxOCArIDI3MDkyMDA4Owpjb25zdCBpbnQgTiA9IDJlNSArIDU7CmludCBuLCBxLCBub2RlW04gPDwgMl0sIGxhenlbTiA8PCAyXTsKaW50IGZpYm9bTl0sIHN0YSwgbGVuOwptYXA8aWksIGludD4gbGFzdDsKdmVjdG9yPGludD4gZmliOwoKaW50IGNhbGNGaWJvKGludCBLKSB7CiAgICBpZiAoSyA8IE4pIHJldHVybiBmaWJvW0tdOwogICAgcmV0dXJuIGZpYlsoSyAtIHN0YSkgJSBsZW5dOwp9Cgp2b2lkIHB1c2hEb3duKGludCBpZCwgaW50IGwsIGludCByKSB7CiAgICBpZiAobGF6eVtpZF0pIHsKICAgICAgICBpbnQgbWlkID0gKGwgKyByKSA+PiAxOwogICAgICAgIG5vZGVbaWQgPDwgMV0gKz0gbGF6eVtpZF0gKiAobWlkIC0gbCArIDEpOwogICAgICAgIG5vZGVbaWQgPDwgMSB8IDFdICs9IGxhenlbaWRdICogKHIgLSBtaWQpOwogICAgICAgIGxhenlbaWQgPDwgMV0gKz0gbGF6eVtpZF07CiAgICAgICAgbGF6eVtpZCA8PCAxIHwgMV0gKz0gbGF6eVtpZF07CiAgICAgICAgbGF6eVtpZF0gPSAwOwogICAgfQp9Cgp2b2lkIHVwZGF0ZShpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2LCBpbnQgaykgewogICAgaWYgKGwgPiB2IHx8IHIgPCB1KSByZXR1cm47CiAgICBpZiAodSA8PSBsICYmIHIgPD0gdikgewogICAgICAgIG5vZGVbaWRdICs9IChyIC0gbCArIDEpICogazsKICAgICAgICBsYXp5W2lkXSArPSBrOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHB1c2hEb3duKGlkLCBsLCByKTsKICAgIGludCBtaWQgPSAobCArIHIpID4+IDE7CiAgICB1cGRhdGUoaWQgPDwgMSwgbCwgbWlkLCB1LCB2LCBrKTsKICAgIHVwZGF0ZShpZCA8PCAxIHwgMSwgbWlkICsgMSwgciwgdSwgdiwgayk7CiAgICBub2RlW2lkXSA9IG5vZGVbaWQgPDwgMV0gKyBub2RlW2lkIDw8IDEgfCAxXTsKfQoKaW50IGdldChpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2KSB7CiAgICBpZiAobCA+IHYgfHwgciA8IHUpIHJldHVybiAwOwogICAgaWYgKHUgPD0gbCAmJiByIDw9IHYpIHJldHVybiBub2RlW2lkXTsKICAgIHB1c2hEb3duKGlkLCBsLCByKTsKICAgIGludCBtaWQgPSAobCArIHIpID4+IDE7CiAgICByZXR1cm4gZ2V0KGlkIDw8IDEsIGwsIG1pZCwgdSwgdikgKyBnZXQoaWQgPDwgMSB8IDEsIG1pZCArIDEsIHIsIHUsIHYpOwp9Cgp2b2lkIGluaXQodm9pZCkgewogICAgY2luID4+IG4gPj4gcTsKICAgIGZpYm9bMV0gPSBmaWJvWzJdID0gMTsKICAgIEZPUihpLCAzLCBOIC0gNSkgZmlib1tpXSA9IChmaWJvW2kgLSAxXSArIGZpYm9baSAtIDJdKSAlIE1PRDsKfQoKdm9pZCBwcm9jZXNzKHZvaWQpIHsKICAgIEZPUihpLCAyLCBOIC0gNSkgewogICAgICAgIGlmIChsYXN0LmZpbmQoe2ZpYm9baS0xXSwgZmlib1tpXX0pICE9IGxhc3QuZW5kKCkpIHsKICAgICAgICAgICAgc3RhID0gbGFzdFt7Zmlib1tpLTFdLCBmaWJvW2ldfV07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBsYXN0W3tmaWJvW2ktMV0sIGZpYm9baV19XSA9IGk7CiAgICB9CgogICAgaW50IGEgPSBmaWJvW3N0YSAtIDFdOwogICAgaW50IGIgPSBmaWJvW3N0YV07CiAgICBmaWIucGIoZmlib1tzdGFdKTsKICAgIGZvcihpbnQgaSA9IHN0YSArIDE7IGZpYm9baV0gIT0gYiB8fCBmaWJvW2kgLSAxXSAhPSBhOyBpKyspIHsKICAgICAgICBmaWIucGIoZmlib1tpXSk7CiAgICB9CiAgICBsZW4gPSAoaW50KWZpYi5zaXplKCk7CgogICAgd2hpbGUocS0tKSB7CiAgICAgICAgaW50IHR5cGU7IGNpbiA+PiB0eXBlOwogICAgICAgIGlmICh0eXBlID09IDEpIHsKICAgICAgICAgICAgaW50IGwsIHIsIGs7CiAgICAgICAgICAgIGNpbiA+PiBsID4+IHIgPj4gazsKICAgICAgICAgICAgdXBkYXRlKDEsIDEsIG4sIGwsIHIsIGNhbGNGaWJvKGspKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbnQgbCwgcjsKICAgICAgICAgICAgY2luID4+IGwgPj4gcjsKICAgICAgICAgICAgY291dCA8PCBnZXQoMSwgMSwgbiwgbCwgcikgPDwgJ1xuJzsKICAgICAgICB9CiAgICB9Cn0KCnNpZ25lZCBtYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsKICAgIGNpbi50aWUoMCk7IGNvdXQudGllKDApOwogICAgaWYgKGZvcGVuKHRhc2siLmlucCIsICJyIikpIHsKICAgICAgICBmcmVvcGVuKHRhc2siLmlucCIsICJyIiwgc3RkaW4pOwogICAgICAgIGZyZW9wZW4odGFzayIub3V0IiwgInciLCBzdGRvdXQpOwogICAgfQogICAgaW50IHRjID0gMTsKLy8gICAgY2luID4+IHRjOwogICAgd2hpbGUodGMtLSkgewogICAgICAgIGluaXQoKTsKICAgICAgICBwcm9jZXNzKCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQo=