/**
* author: orzvanh14
* created: 23.12.2022 10:08:02
* too lazy to update time
**/
// i wants to take ioi
//binhtinhtutinkhongcaycunhungmotkhikhongcontutinnualatuyetvong
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define nn "\n"
#define pi pair<int, int>
#define fi first
#define se second
#define lb lower_bound
#define ub upper_bound
#define eb emplace_back
#define pb push_back
#define TASK " "
#define ms(a, x) memset(a, x, sizeof(a))
#define all(a) a.begin(), a.end()
#define All(a, n) a + 1, a + 1 + n
#define LOG 19
const int INF = 1e18;
const int mod = 1e3+7;
const int N = 2e5 + 5;
const int maxN = 1e5 + 5;
int MOD = 998244353;
int bit[200000];
struct node{
int kc, u, hk;
bool operator<(const node& other) const {
return kc > other.kc;
}
};
struct edge{
int u, v, w, id;
friend bool operator < ( edge a, edge b){
return a.w > b.w;
}
};
int n,q;
int a[N];
int st[4 * N]; int lazy[4 * N];
int dp[N];
void nhap(){
cin >> n >> q;
// for(int i = 1;i <= n; i++){
// cin >> a[i];
// }
}
pi fast_doubling(int n){
if (n == 0) return {0, 1};
pi p = fast_doubling(n >> 1);
int fk = p.fi;
int fk1 = p.se;
int f2k = (fk * ((2 * fk1 - fk + mod) % mod)) % mod;
int f2k1 = (fk1 * fk1 % mod + fk * fk % mod) % mod;
if(n % 2 == 0) return {f2k, f2k1};
else return {f2k1, (f2k + f2k1) % mod};
}
void build(int id, int l, int r){
if(l == r){
st[id] = a[l];
}
else{
int m = l + r >> 1;
build(2 * id, l, m);
build(2 * id + 1, m + 1, r);
st[id] = st[2 * id] + st[2 * id + 1];
}
}
void fix(int id, int l, int r){
if(!lazy[id]) return;
st[id] = (st[id] + lazy[id] * (r - l + 1)) % mod;
if(l != r){
lazy[2 * id] = (lazy[2 * id] + lazy[id]) % mod;
lazy[2 * id + 1] = (lazy[2 * id + 1] + lazy[id]) % mod;
}
lazy[id] = 0;
}
void update(int id, int l, int r, int u, int v,int val){
fix(id, l, r);
if(l > v || r < u) return;
if(l >= u && r <= v){
lazy[id] = (lazy[id] + fast_doubling(val).fi) % mod;
fix(id, l, r);
return;
}
int m = l + r >> 1;
update(2 * id, l, m, u, v, val);
update(2 * id + 1, m + 1, r, u, v, val);
st[id] = (st[2 * id] + st[2 * id + 1]) % mod;
}
int get(int id,int l,int r,int u,int v){
fix(id, l , r);
if(l > v || u > r) return 0;
if(l >= u && r <= v){
return st[id];
}
int m = l + r >> 1;
int get1 = get(2 * id, l, m, u, v);
int get2 = get(2 * id + 1, m + 1, r, u, v);
return (get1 + get2) % mod;
}
void solve(){
int ans = 0;
// build(1, 1, n);
while(q--){
int op;
cin >> op;
if(op == 1){
int l, r, k;
cin >> l >> r >> k;
update(1, 1, n, l, r, k);
}
else{
int l, r;
cin >> l >> r;
cout << get(1, 1, n, l, r) << nn;
}
}
}
signed main() {
// freopen("piggyback.in", "r", stdin);
// freopen("piggyback.out", "w", stdout);
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
nhap();
solve();
return (0 ^ 0);
}
LyoqCiAqICAgIGF1dGhvcjogIG9yenZhbmgxNAogKiAgICBjcmVhdGVkOiAyMy4xMi4yMDIyIDEwOjA4OjAyCiAqICAgIHRvbyBsYXp5IHRvIHVwZGF0ZSB0aW1lCioqLwovLyBpIHdhbnRzIHRvIHRha2UgaW9pCi8vYmluaHRpbmh0dXRpbmtob25nY2F5Y3VuaHVuZ21vdGtoaWtob25nY29udHV0aW5udWFsYXR1eWV0dm9uZwojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIGludCBsb25nIGxvbmcKI2RlZmluZSBubiAiXG4iCiNkZWZpbmUgcGkgcGFpcjxpbnQsIGludD4KI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIGxiIGxvd2VyX2JvdW5kCiNkZWZpbmUgdWIgdXBwZXJfYm91bmQKI2RlZmluZSBlYiBlbXBsYWNlX2JhY2sKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBUQVNLICIgIgoKI2RlZmluZSBtcyhhLCB4KSBtZW1zZXQoYSwgeCwgc2l6ZW9mKGEpKQojZGVmaW5lIGFsbChhKSBhLmJlZ2luKCksIGEuZW5kKCkKI2RlZmluZSBBbGwoYSwgbikgYSArIDEsIGEgKyAxICsgbgoKI2RlZmluZSBMT0cgMTkKCgpjb25zdCBpbnQgSU5GID0gMWUxODsKY29uc3QgaW50IG1vZCA9IDFlMys3Owpjb25zdCBpbnQgTiA9IDJlNSAgKyA1Owpjb25zdCBpbnQgbWF4TiA9IDFlNSArIDU7CmludCBNT0QgPSA5OTgyNDQzNTM7CmludCBiaXRbMjAwMDAwXTsKc3RydWN0IG5vZGV7CglpbnQga2MsIHUsIGhrOwoJYm9vbCBvcGVyYXRvcjwoY29uc3Qgbm9kZSYgb3RoZXIpIGNvbnN0IHsKICAgICAgICByZXR1cm4ga2MgPiBvdGhlci5rYzsgCiAgICB9Cn07CnN0cnVjdCBlZGdlewoJaW50IHUsIHYsIHcsIGlkOwoJZnJpZW5kIGJvb2wgb3BlcmF0b3IgPCAoIGVkZ2UgYSwgZWRnZSBiKXsKCQlyZXR1cm4gYS53ID4gYi53OwoJfQp9OwppbnQgbixxOwppbnQgYVtOXTsKaW50IHN0WzQgKiBOXTsgaW50IGxhenlbNCAqIE5dOwppbnQgZHBbTl07CnZvaWQgbmhhcCgpewogICAgY2luID4+IG4gPj4gcTsKCS8vIGZvcihpbnQgaSA9IDE7aSA8PSBuOyBpKyspewoJCS8vIGNpbiA+PiBhW2ldOwoJLy8gfQp9CnBpIGZhc3RfZG91YmxpbmcoaW50IG4pewoJaWYgKG4gPT0gMCkgcmV0dXJuIHswLCAxfTsKCXBpIHAgPSBmYXN0X2RvdWJsaW5nKG4gPj4gMSk7CglpbnQgZmsgPSBwLmZpOyAgICAKICAgIGludCBmazEgPSBwLnNlOwogICAgaW50IGYyayA9IChmayAqICgoMiAqIGZrMSAtIGZrICsgbW9kKSAlIG1vZCkpICUgbW9kOwogICAgaW50IGYyazEgPSAoZmsxICogZmsxICUgbW9kICsgZmsgKiBmayAlIG1vZCkgJSBtb2Q7CiAgICBpZihuICUgMiA9PSAwKSByZXR1cm4ge2YyaywgZjJrMX07CiAgICBlbHNlIHJldHVybiB7ZjJrMSwgKGYyayArIGYyazEpICUgbW9kfTsKfQp2b2lkIGJ1aWxkKGludCBpZCwgaW50IGwsIGludCByKXsKCWlmKGwgPT0gcil7CgkJc3RbaWRdID0gYVtsXTsKCX0KCWVsc2V7CgkJaW50IG0gPSBsICsgciA+PiAxOwoJCWJ1aWxkKDIgKiBpZCwgbCwgbSk7CgkJYnVpbGQoMiAqIGlkICsgMSwgbSArIDEsIHIpOwoJCXN0W2lkXSA9IHN0WzIgKiBpZF0gKyBzdFsyICogaWQgKyAxXTsKCX0KfQp2b2lkIGZpeChpbnQgaWQsIGludCBsLCBpbnQgcil7CglpZighbGF6eVtpZF0pIHJldHVybjsKCXN0W2lkXSA9IChzdFtpZF0gKyBsYXp5W2lkXSAqIChyIC0gbCArIDEpKSAlIG1vZDsKCQoJaWYobCAhPSByKXsKCQlsYXp5WzIgKiBpZF0gPSAobGF6eVsyICogaWRdICsgbGF6eVtpZF0pICUgbW9kOwogICAgICAgIGxhenlbMiAqIGlkICsgMV0gPSAobGF6eVsyICogaWQgKyAxXSArIGxhenlbaWRdKSAlIG1vZDsKCX0KCWxhenlbaWRdID0gMDsKfQp2b2lkIHVwZGF0ZShpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2LGludCB2YWwpewoJZml4KGlkLCBsLCByKTsKCWlmKGwgPiB2IHx8IHIgPCB1KSByZXR1cm47CglpZihsID49IHUgJiYgciA8PSB2KXsKCQlsYXp5W2lkXSA9IChsYXp5W2lkXSArIGZhc3RfZG91YmxpbmcodmFsKS5maSkgJSBtb2Q7CgkJZml4KGlkLCBsLCByKTsKCQlyZXR1cm47Cgl9CglpbnQgbSA9IGwgKyByID4+IDE7Cgl1cGRhdGUoMiAqIGlkLCBsLCBtLCB1LCB2LCB2YWwpOwoJdXBkYXRlKDIgKiBpZCArIDEsIG0gKyAxLCByLCB1LCB2LCB2YWwpOwoJc3RbaWRdID0gKHN0WzIgKiBpZF0gKyBzdFsyICogaWQgKyAxXSkgJSBtb2Q7Cn0KaW50IGdldChpbnQgaWQsaW50IGwsaW50IHIsaW50IHUsaW50IHYpewoJZml4KGlkLCBsICwgcik7CglpZihsID4gdiB8fCB1ID4gcikgcmV0dXJuIDA7CglpZihsID49IHUgJiYgciA8PSB2KXsKCQlyZXR1cm4gc3RbaWRdOwkKCX0KCWludCBtID0gbCArIHIgPj4gMTsKCWludCBnZXQxID0gZ2V0KDIgKiBpZCwgbCwgbSwgdSwgdik7CglpbnQgZ2V0MiA9IGdldCgyICogaWQgKyAxLCBtICsgMSwgciwgdSwgdik7CglyZXR1cm4gKGdldDEgKyBnZXQyKSAlIG1vZDsKfQp2b2lkIHNvbHZlKCl7CglpbnQgYW5zID0gMDsKCS8vIGJ1aWxkKDEsIDEsIG4pOwoJd2hpbGUocS0tKXsKCQlpbnQgb3A7CgkJY2luID4+IG9wOwoJCWlmKG9wID09IDEpewoJCQlpbnQgbCwgciwgazsKCQkJY2luID4+IGwgPj4gciA+PiBrOwoJCQl1cGRhdGUoMSwgMSwgbiwgbCwgciwgayk7CgkJfQoJCWVsc2V7CgkJCWludCBsLCByOwoJCQljaW4gPj4gbCA+PiByOwoJCQljb3V0IDw8IGdldCgxLCAxLCBuLCBsLCByKSA8PCBubjsKCQl9Cgl9Cn0Kc2lnbmVkIG1haW4oKSB7CgkvLyBmcmVvcGVuKCJwaWdneWJhY2suaW4iLCAiciIsIHN0ZGluKTsKCS8vIGZyZW9wZW4oInBpZ2d5YmFjay5vdXQiLCAidyIsIHN0ZG91dCk7Cglpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwoJY2luLnRpZSgwKTsKCWNvdXQudGllKDApOwogICAgbmhhcCgpOwogICAgc29sdmUoKTsKCXJldHVybiAoMCBeIDApOwoKfQo=