#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define int long long
#define F(i, l, r) for(int i = l; i <= r; ++i)
#define E(i, l, r) for(int i = l; i >= r; --i)
#define eb emplace_back
const ll mod = 1e9 + 7;
const int ars = 1e5 + 5;
const int ii = 1e9;
const ll il = 1e18;
int n, m, a[ars];
struct node {
int sum, lza, lzb;
node() {
sum = lza = lzb = 0;
}
node(int s, int a, int b) : sum(s), lza(a), lzb(b) {}
} st[ars * 4];
// ta biến đổi lượng cộng vào đoạn f(i)
// f(i) = A * si + C = A * si + (B - A * L);
// si là tổng sigma i: l->r
void apply(int id, int l, int r, int A, int C) {
int len = r - l + 1;
int si = (len * l) + (len * (len - 1) / 2); si %= mod;
int fi = (A * si + C * len) % mod;
st[id].sum = (st[id].sum + fi) % mod;
st[id].lza = (st[id].lza + A) % mod;
st[id].lzb = (st[id].lzb + C) % mod;
}
void push(int id, int l, int r) {
if(!st[id].lza and !st[id].lzb) return;
int mid = (l + r) / 2;
apply(id * 2, l, mid, st[id].lza, st[id].lzb);
apply(id * 2 + 1, mid + 1, r, st[id].lza, st[id].lzb);
st[id].lza = st[id].lzb = 0;
}
void update(int id, int l, int r, int L, int R, int A, int B) {
if(l > R or r < L) return;
if(l >= L and r <= R) {
int C = B - A * L;
C = (C % mod) + mod; C %= mod;
apply(id, l, r, A % mod, C);
return;
}
push(id, l, r);
int mid = (l + r) / 2;
update(id * 2, l, mid, L, R, A, B);
update(id * 2 + 1, mid + 1, r, L, R, A, B);
st[id].sum = (st[id * 2].sum + st[id * 2 + 1].sum) % mod;
}
int get(int id, int l, int r, int L, int R) {
if(l > R or r < L) return 0;
if(l >= L and r <= R) return st[id].sum;
push(id, l, r);
int mid = (l + r) / 2;
return (get(id * 2, l, mid, L, R) + get(id * 2 + 1, mid + 1, r, L, R)) % mod;
}
signed main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n >> m;
F(i, 1, m) {
int t; cin >> t;
if(t == 1) {
int L, R, A, B;
cin >> L >> R >> A >> B;
update(1, 1, n, L, R, A, B);
}else {
int L, R;
cin >> L >> R;
cout << get(1, 1, n, L, R) << "\n";
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIGxsID0gbG9uZyBsb25nOwojZGVmaW5lIGludCBsb25nIGxvbmcKI2RlZmluZSBGKGksIGwsIHIpIGZvcihpbnQgaSA9IGw7IGkgPD0gcjsgKytpKQojZGVmaW5lIEUoaSwgbCwgcikgZm9yKGludCBpID0gbDsgaSA+PSByOyAtLWkpCiNkZWZpbmUgZWIgZW1wbGFjZV9iYWNrCmNvbnN0IGxsIG1vZCA9IDFlOSArIDc7CmNvbnN0IGludCBhcnMgPSAxZTUgKyA1Owpjb25zdCBpbnQgaWkgPSAxZTk7CmNvbnN0IGxsIGlsID0gMWUxODsKCmludCBuLCBtLCBhW2Fyc107CnN0cnVjdCBub2RlIHsKICAgIGludCBzdW0sIGx6YSwgbHpiOwogICAgbm9kZSgpIHsKICAgICAgICBzdW0gPSBsemEgPSBsemIgPSAwOwogICAgfQogICAgbm9kZShpbnQgcywgaW50IGEsIGludCBiKSA6IHN1bShzKSwgbHphKGEpLCBsemIoYikge30KfSBzdFthcnMgKiA0XTsKCgovLyB0YSBiaeG6v24gxJHhu5VpIGzGsOG7o25nIGPhu5luZyB2w6BvIMSRb+G6oW4gZihpKQovLyBmKGkpID0gQSAqIHNpICsgQyA9IEEgKiBzaSArIChCIC0gQSAqIEwpOwovLyBzaSBsw6AgdOG7lW5nIHNpZ21hIGk6IGwtPnIKdm9pZCBhcHBseShpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IEEsIGludCBDKSB7CiAgICBpbnQgbGVuID0gciAtIGwgKyAxOwogICAgaW50IHNpID0gKGxlbiAqIGwpICsgKGxlbiAqIChsZW4gLSAxKSAvIDIpOyBzaSAlPSBtb2Q7CiAgICBpbnQgZmkgPSAoQSAqIHNpICsgQyAqIGxlbikgJSBtb2Q7CgogICAgc3RbaWRdLnN1bSA9IChzdFtpZF0uc3VtICsgZmkpICUgbW9kOwogICAgc3RbaWRdLmx6YSA9IChzdFtpZF0ubHphICsgQSkgJSBtb2Q7CiAgICBzdFtpZF0ubHpiID0gKHN0W2lkXS5semIgKyBDKSAlIG1vZDsKfQoKdm9pZCBwdXNoKGludCBpZCwgaW50IGwsIGludCByKSB7CiAgICBpZighc3RbaWRdLmx6YSBhbmQgIXN0W2lkXS5semIpIHJldHVybjsKICAgIGludCBtaWQgPSAobCArIHIpIC8gMjsKCiAgICBhcHBseShpZCAqIDIsICAgICBsLCAgICAgbWlkLCBzdFtpZF0ubHphLCBzdFtpZF0ubHpiKTsKICAgIGFwcGx5KGlkICogMiArIDEsIG1pZCArIDEsIHIsIHN0W2lkXS5semEsIHN0W2lkXS5semIpOwogICAgc3RbaWRdLmx6YSA9IHN0W2lkXS5semIgPSAwOwp9Cgp2b2lkIHVwZGF0ZShpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IEwsIGludCBSLCBpbnQgQSwgaW50IEIpIHsKICAgIGlmKGwgPiBSIG9yIHIgPCBMKSByZXR1cm47CiAgICBpZihsID49IEwgYW5kIHIgPD0gUikgewogICAgICAgIGludCBDID0gQiAtIEEgKiBMOwogICAgICAgIEMgPSAoQyAlIG1vZCkgKyBtb2Q7IEMgJT0gbW9kOwogICAgICAgIGFwcGx5KGlkLCBsLCByLCBBICUgbW9kLCBDKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBwdXNoKGlkLCBsLCByKTsKICAgIGludCBtaWQgPSAobCArIHIpIC8gMjsKICAgIHVwZGF0ZShpZCAqIDIsICAgICBsLCAgICAgbWlkLCBMLCBSLCBBLCBCKTsKICAgIHVwZGF0ZShpZCAqIDIgKyAxLCBtaWQgKyAxLCByLCBMLCBSLCBBLCBCKTsKICAgIHN0W2lkXS5zdW0gPSAoc3RbaWQgKiAyXS5zdW0gKyBzdFtpZCAqIDIgKyAxXS5zdW0pICUgbW9kOwp9CgppbnQgZ2V0KGludCBpZCwgaW50IGwsIGludCByLCBpbnQgTCwgaW50IFIpIHsKICAgIGlmKGwgPiBSIG9yIHIgPCBMKSByZXR1cm4gMDsKICAgIGlmKGwgPj0gTCBhbmQgciA8PSBSKSByZXR1cm4gc3RbaWRdLnN1bTsKICAgIHB1c2goaWQsIGwsIHIpOwogICAgaW50IG1pZCA9IChsICsgcikgLyAyOwogICAgcmV0dXJuIChnZXQoaWQgKiAyLCBsLCBtaWQsIEwsIFIpICsgZ2V0KGlkICogMiArIDEsIG1pZCArIDEsIHIsIEwsIFIpKSAlIG1vZDsKfQoKc2lnbmVkIG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbygwKTsgY2luLnRpZSgwKTsgY291dC50aWUoMCk7CiAgICBjaW4gPj4gbiA+PiBtOwoKICAgIEYoaSwgMSwgbSkgewogICAgICAgIGludCB0OyBjaW4gPj4gdDsKICAgICAgICBpZih0ID09IDEpIHsKICAgICAgICAgICAgaW50IEwsIFIsIEEsIEI7CiAgICAgICAgICAgIGNpbiA+PiBMID4+IFIgPj4gQSA+PiBCOwogICAgICAgICAgICB1cGRhdGUoMSwgMSwgbiwgTCwgUiwgQSwgQik7CiAgICAgICAgfWVsc2UgewogICAgICAgICAgICBpbnQgTCwgUjsKICAgICAgICAgICAgY2luID4+IEwgPj4gUjsKICAgICAgICAgICAgY291dCA8PCBnZXQoMSwgMSwgbiwgTCwgUikgPDwgIlxuIjsKICAgICAgICB9CiAgICB9CiAgICAKCiAgICByZXR1cm4gMDsKfQ==