// Done by AnhHao215
// On 19/07/2025
#include <bits/stdc++.h>
using namespace std;
#define Ngbanh() signed main()
#define Task "SEGMENTTREE"
#define in() Task".inp"
#define out() Task".out"
#define FOR(i,a,b) for(int i=a;i<b;i++)
#define REP(i,a,b) for(int i=a;i<=b;i++)
#define FORD(i,a,b) for(int i=a-1;i>=b;i--)
#define REPD(i,a,b) for(int i=a;i>=b;i--)
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define pb emplace_back
#define mp make_pair
#define reset(f, x) memset(f, x, sizeof(f))
#define sz(x) int(x.size())
#define bit(x, i) ((x >> i) & 1)
#define F first
#define S second
#define endl "\n"
#define sp ' '
#define elif else if
#define mid int((l + r) / 2)
#define toL int(node << 1)
#define toR int(node << 1 | 1)
#define Optimize() ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define Fopen() if(fopen(in(),"r")){freopen(in(),"r",stdin);freopen(out(),"w",stdout);}
#pragma GCC optimize("O3")
#pragma GCC target("avx,avx2,fma,sse4.2")
#pragma GCC optimize("unroll-loops")
typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef pair<int, int> pii;
const int maxn = 1e5 + 5;
const int base = 31;
const int MOD = 1e9 + 7;
const ll INF = 1e18;
int n, q;
int a[maxn];
ll tree[4 * maxn], val_add[4 * maxn], val_mul[4 * maxn], val_set[4 * maxn];
void Init(int node, int l, int r) {
val_add[node] = 0;
val_mul[node] = 1;
val_set[node] = -1;
if(l == r) {
tree[node] = a[l] % MOD;
return;
}
Init(toL, l, mid);
Init(toR, mid + 1, r);
tree[node] = (tree[toL] + tree[toR]) % MOD;
}
void PushSet(int node, int l, int r) {
if(val_set[node] == -1) return;
tree[node] = val_set[node] * (r - l + 1) % MOD;
if(l != r) {
val_set[toL] = val_set[toR] = val_set[node];
val_add[toL] = val_add[toR] = 0;
val_mul[toL] = val_mul[toR] = 1;
}
val_set[node] = -1;
}
void PushMul(int node, int l, int r) {
if(val_mul[node] == 1) return;
tree[node] = tree[node] * val_mul[node] % MOD;
if(l != r) {
val_mul[toL] = val_mul[toL] * val_mul[node] % MOD;
val_mul[toR] = val_mul[toR] * val_mul[node] % MOD;
val_add[toL] = val_add[toL] * val_mul[node] % MOD;
val_add[toR] = val_add[toR] * val_mul[node] % MOD;
}
val_mul[node] = 1;
}
void PushAdd(int node, int l, int r) {
if(val_add[node] == 0) return;
tree[node] = (tree[node] + val_add[node] * (r - l + 1)) % MOD;
if (l != r) {
val_add[toL] = (val_add[toL] + val_add[node]) % MOD;
val_add[toR] = (val_add[toR] + val_add[node]) % MOD;
}
val_add[node] = 0;
}
void Push(int node, int l, int r) {
PushSet(node, l, r);
PushMul(node, l, r);
PushAdd(node, l, r);
}
void UpdateAdd(int node, int l, int r, int u, int v, ll w) {
Push(node, l, r);
if (v < l || r < u) return;
if (u <= l && r <= v) {
val_add[node] = (val_add[node] + w) % MOD;
Push(node, l, r);
return;
}
UpdateAdd(toL, l, mid, u, v, w);
UpdateAdd(toR, mid + 1, r, u, v, w);
tree[node] = (tree[toL] + tree[toR]) % MOD;
}
void UpdateMul(int node, int l, int r, int u, int v, ll w) {
Push(node, l, r);
if (v < l || r < u) return;
if (u <= l && r <= v) {
val_mul[node] = val_mul[node] * w % MOD;
Push(node, l, r);
return;
}
UpdateMul(toL, l, mid, u, v, w);
UpdateMul(toR, mid + 1, r, u, v, w);
tree[node] = (tree[toL] + tree[toR]) % MOD;
}
void UpdateAlt(int node, int l, int r, int u, int v, ll w) {
Push(node, l, r);
if (v < l || r < u) return;
if (u <= l && r <= v) {
val_set[node] = w;
val_add[node] = 0;
val_mul[node] = 1;
Push(node, l, r);
return;
}
UpdateAlt(toL, l, mid, u, v, w);
UpdateAlt(toR, mid + 1, r, u, v, w);
tree[node] = (tree[toL] + tree[toR]) % MOD;
}
ll GetSum(int node, int l, int r, int u, int v) {
Push(node, l, r);
if (v < l || r < u) return 0;
if (u <= l && r <= v) return tree[node];
return (GetSum(toL, l, mid, u, v) + GetSum(toR, mid + 1, r, u, v)) % MOD;
}
Ngbanh() {
Optimize();
Fopen();
cin >> n >> q;
REP(i, 1, n) cin >> a[i];
Init(1, 1, n);
FOR(i, 0, q) {
int type, u, v;
ll w;
cin >> type;
if (type == 1) {
cin >> u >> v >> w;
UpdateAdd(1, 1, n, u, v, w);
}
elif (type == 2) {
cin >> u >> v >> w;
UpdateMul(1, 1, n, u, v, w);
}
elif (type == 3) {
cin >> u >> v >> w;
UpdateAlt(1, 1, n, u, v, w);
}
elif (type == 4) {
cin >> u >> v;
cout << GetSum(1, 1, n, u, v) << endl;
}
}
return 0;
}
Ly8gRG9uZSBieSBBbmhIYW8yMTUKLy8gT24gMTkvMDcvMjAyNQoKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIE5nYmFuaCgpIHNpZ25lZCBtYWluKCkKI2RlZmluZSBUYXNrICJTRUdNRU5UVFJFRSIKI2RlZmluZSBpbigpIFRhc2siLmlucCIKI2RlZmluZSBvdXQoKSBUYXNrIi5vdXQiCgojZGVmaW5lIEZPUihpLGEsYikgZm9yKGludCBpPWE7aTxiO2krKykKI2RlZmluZSBSRVAoaSxhLGIpIGZvcihpbnQgaT1hO2k8PWI7aSsrKQojZGVmaW5lIEZPUkQoaSxhLGIpIGZvcihpbnQgaT1hLTE7aT49YjtpLS0pCiNkZWZpbmUgUkVQRChpLGEsYikgZm9yKGludCBpPWE7aT49YjtpLS0pCgojZGVmaW5lIGFsbCh4KSB4LmJlZ2luKCksIHguZW5kKCkKI2RlZmluZSByYWxsKHgpIHgucmJlZ2luKCksIHgucmVuZCgpCiNkZWZpbmUgcGIgZW1wbGFjZV9iYWNrCiNkZWZpbmUgbXAgbWFrZV9wYWlyCiNkZWZpbmUgcmVzZXQoZiwgeCkgbWVtc2V0KGYsIHgsIHNpemVvZihmKSkKI2RlZmluZSBzeih4KSBpbnQoeC5zaXplKCkpCiNkZWZpbmUgYml0KHgsIGkpICgoeCA+PiBpKSAmIDEpCgojZGVmaW5lIEYgZmlyc3QKI2RlZmluZSBTIHNlY29uZAojZGVmaW5lIGVuZGwgIlxuIgojZGVmaW5lIHNwICcgJwojZGVmaW5lIGVsaWYgZWxzZSBpZgojZGVmaW5lIG1pZCBpbnQoKGwgKyByKSAvIDIpCiNkZWZpbmUgdG9MIGludChub2RlIDw8IDEpCiNkZWZpbmUgdG9SIGludChub2RlIDw8IDEgfCAxKQoKI2RlZmluZSBPcHRpbWl6ZSgpIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7Y2luLnRpZSgwKTtjb3V0LnRpZSgwKTsKI2RlZmluZSBGb3BlbigpIGlmKGZvcGVuKGluKCksInIiKSl7ZnJlb3BlbihpbigpLCJyIixzdGRpbik7ZnJlb3BlbihvdXQoKSwidyIsc3Rkb3V0KTt9CgojcHJhZ21hIEdDQyBvcHRpbWl6ZSgiTzMiKQojcHJhZ21hIEdDQyB0YXJnZXQoImF2eCxhdngyLGZtYSxzc2U0LjIiKQojcHJhZ21hIEdDQyBvcHRpbWl6ZSgidW5yb2xsLWxvb3BzIikKCnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIGxvbmcgZG91YmxlIGxkOwp0eXBlZGVmIHZlY3RvcjxpbnQ+IHZpOwp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IHBpaTsKCmNvbnN0IGludCBtYXhuID0gMWU1ICsgNTsKY29uc3QgaW50IGJhc2UgPSAzMTsKY29uc3QgaW50IE1PRCA9IDFlOSArIDc7CmNvbnN0IGxsIElORiA9IDFlMTg7CgppbnQgbiwgcTsKaW50IGFbbWF4bl07CmxsIHRyZWVbNCAqIG1heG5dLCB2YWxfYWRkWzQgKiBtYXhuXSwgdmFsX211bFs0ICogbWF4bl0sIHZhbF9zZXRbNCAqIG1heG5dOwoKdm9pZCBJbml0KGludCBub2RlLCBpbnQgbCwgaW50IHIpIHsKICAgIHZhbF9hZGRbbm9kZV0gPSAwOwogICAgdmFsX211bFtub2RlXSA9IDE7CiAgICB2YWxfc2V0W25vZGVdID0gLTE7CiAgICBpZihsID09IHIpIHsKICAgICAgICB0cmVlW25vZGVdID0gYVtsXSAlIE1PRDsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBJbml0KHRvTCwgbCwgbWlkKTsKICAgIEluaXQodG9SLCBtaWQgKyAxLCByKTsKICAgIHRyZWVbbm9kZV0gPSAodHJlZVt0b0xdICsgdHJlZVt0b1JdKSAlIE1PRDsKfQoKdm9pZCBQdXNoU2V0KGludCBub2RlLCBpbnQgbCwgaW50IHIpIHsKICAgIGlmKHZhbF9zZXRbbm9kZV0gPT0gLTEpIHJldHVybjsKICAgIHRyZWVbbm9kZV0gPSB2YWxfc2V0W25vZGVdICogKHIgLSBsICsgMSkgJSBNT0Q7CiAgICBpZihsICE9IHIpIHsKICAgICAgICB2YWxfc2V0W3RvTF0gPSB2YWxfc2V0W3RvUl0gPSB2YWxfc2V0W25vZGVdOwogICAgICAgIHZhbF9hZGRbdG9MXSA9IHZhbF9hZGRbdG9SXSA9IDA7CiAgICAgICAgdmFsX211bFt0b0xdID0gdmFsX211bFt0b1JdID0gMTsKICAgIH0KICAgIHZhbF9zZXRbbm9kZV0gPSAtMTsKfQoKdm9pZCBQdXNoTXVsKGludCBub2RlLCBpbnQgbCwgaW50IHIpIHsKICAgIGlmKHZhbF9tdWxbbm9kZV0gPT0gMSkgcmV0dXJuOwogICAgdHJlZVtub2RlXSA9IHRyZWVbbm9kZV0gKiB2YWxfbXVsW25vZGVdICUgTU9EOwogICAgaWYobCAhPSByKSB7CiAgICAgICAgdmFsX211bFt0b0xdID0gdmFsX211bFt0b0xdICogdmFsX211bFtub2RlXSAlIE1PRDsKICAgICAgICB2YWxfbXVsW3RvUl0gPSB2YWxfbXVsW3RvUl0gKiB2YWxfbXVsW25vZGVdICUgTU9EOwogICAgICAgIHZhbF9hZGRbdG9MXSA9IHZhbF9hZGRbdG9MXSAqIHZhbF9tdWxbbm9kZV0gJSBNT0Q7CiAgICAgICAgdmFsX2FkZFt0b1JdID0gdmFsX2FkZFt0b1JdICogdmFsX211bFtub2RlXSAlIE1PRDsKICAgIH0KICAgIHZhbF9tdWxbbm9kZV0gPSAxOwp9Cgp2b2lkIFB1c2hBZGQoaW50IG5vZGUsIGludCBsLCBpbnQgcikgewogICAgaWYodmFsX2FkZFtub2RlXSA9PSAwKSAgcmV0dXJuOwogICAgdHJlZVtub2RlXSA9ICh0cmVlW25vZGVdICsgdmFsX2FkZFtub2RlXSAqIChyIC0gbCArIDEpKSAlIE1PRDsKICAgIGlmIChsICE9IHIpIHsKICAgICAgICB2YWxfYWRkW3RvTF0gPSAodmFsX2FkZFt0b0xdICsgdmFsX2FkZFtub2RlXSkgJSBNT0Q7CiAgICAgICAgdmFsX2FkZFt0b1JdID0gKHZhbF9hZGRbdG9SXSArIHZhbF9hZGRbbm9kZV0pICUgTU9EOwogICAgfQogICAgdmFsX2FkZFtub2RlXSA9IDA7Cn0KCnZvaWQgUHVzaChpbnQgbm9kZSwgaW50IGwsIGludCByKSB7CiAgICBQdXNoU2V0KG5vZGUsIGwsIHIpOwogICAgUHVzaE11bChub2RlLCBsLCByKTsKICAgIFB1c2hBZGQobm9kZSwgbCwgcik7Cn0KCnZvaWQgVXBkYXRlQWRkKGludCBub2RlLCBpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgdiwgbGwgdykgewogICAgUHVzaChub2RlLCBsLCByKTsKICAgIGlmICh2IDwgbCB8fCByIDwgdSkgcmV0dXJuOwogICAgaWYgKHUgPD0gbCAmJiByIDw9IHYpIHsKICAgICAgICB2YWxfYWRkW25vZGVdID0gKHZhbF9hZGRbbm9kZV0gKyB3KSAlIE1PRDsKICAgICAgICBQdXNoKG5vZGUsIGwsIHIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIFVwZGF0ZUFkZCh0b0wsIGwsIG1pZCwgdSwgdiwgdyk7CiAgICBVcGRhdGVBZGQodG9SLCBtaWQgKyAxLCByLCB1LCB2LCB3KTsKICAgIHRyZWVbbm9kZV0gPSAodHJlZVt0b0xdICsgdHJlZVt0b1JdKSAlIE1PRDsKfQoKdm9pZCBVcGRhdGVNdWwoaW50IG5vZGUsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2LCBsbCB3KSB7CiAgICBQdXNoKG5vZGUsIGwsIHIpOwogICAgaWYgKHYgPCBsIHx8IHIgPCB1KSByZXR1cm47CiAgICBpZiAodSA8PSBsICYmIHIgPD0gdikgewogICAgICAgIHZhbF9tdWxbbm9kZV0gPSB2YWxfbXVsW25vZGVdICogdyAlIE1PRDsKICAgICAgICBQdXNoKG5vZGUsIGwsIHIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIFVwZGF0ZU11bCh0b0wsIGwsIG1pZCwgdSwgdiwgdyk7CiAgICBVcGRhdGVNdWwodG9SLCBtaWQgKyAxLCByLCB1LCB2LCB3KTsKICAgIHRyZWVbbm9kZV0gPSAodHJlZVt0b0xdICsgdHJlZVt0b1JdKSAlIE1PRDsKfQoKdm9pZCBVcGRhdGVBbHQoaW50IG5vZGUsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2LCBsbCB3KSB7CiAgICBQdXNoKG5vZGUsIGwsIHIpOwogICAgaWYgKHYgPCBsIHx8IHIgPCB1KSByZXR1cm47CiAgICBpZiAodSA8PSBsICYmIHIgPD0gdikgewogICAgICAgIHZhbF9zZXRbbm9kZV0gPSB3OwogICAgICAgIHZhbF9hZGRbbm9kZV0gPSAwOwogICAgICAgIHZhbF9tdWxbbm9kZV0gPSAxOwogICAgICAgIFB1c2gobm9kZSwgbCwgcik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgVXBkYXRlQWx0KHRvTCwgbCwgbWlkLCB1LCB2LCB3KTsKICAgIFVwZGF0ZUFsdCh0b1IsIG1pZCArIDEsIHIsIHUsIHYsIHcpOwogICAgdHJlZVtub2RlXSA9ICh0cmVlW3RvTF0gKyB0cmVlW3RvUl0pICUgTU9EOwp9CgpsbCBHZXRTdW0oaW50IG5vZGUsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2KSB7CiAgICBQdXNoKG5vZGUsIGwsIHIpOwogICAgaWYgKHYgPCBsIHx8IHIgPCB1KSByZXR1cm4gMDsKICAgIGlmICh1IDw9IGwgJiYgciA8PSB2KSByZXR1cm4gdHJlZVtub2RlXTsKICAgIHJldHVybiAoR2V0U3VtKHRvTCwgbCwgbWlkLCB1LCB2KSArIEdldFN1bSh0b1IsIG1pZCArIDEsIHIsIHUsIHYpKSAlIE1PRDsKfQoKTmdiYW5oKCkgewogICAgT3B0aW1pemUoKTsKICAgIEZvcGVuKCk7CgogICAgY2luID4+IG4gPj4gcTsKICAgIFJFUChpLCAxLCBuKSBjaW4gPj4gYVtpXTsKICAgIEluaXQoMSwgMSwgbik7CgogICAgRk9SKGksIDAsIHEpIHsKICAgICAgICBpbnQgdHlwZSwgdSwgdjsKICAgICAgICBsbCB3OwogICAgICAgIGNpbiA+PiB0eXBlOwogICAgICAgIGlmICh0eXBlID09IDEpIHsKICAgICAgICAgICAgY2luID4+IHUgPj4gdiA+PiB3OwogICAgICAgICAgICBVcGRhdGVBZGQoMSwgMSwgbiwgdSwgdiwgdyk7CiAgICAgICAgfQogICAgICAgIGVsaWYgKHR5cGUgPT0gMikgewogICAgICAgICAgICBjaW4gPj4gdSA+PiB2ID4+IHc7CiAgICAgICAgICAgIFVwZGF0ZU11bCgxLCAxLCBuLCB1LCB2LCB3KTsKICAgICAgICB9CiAgICAgICAgZWxpZiAodHlwZSA9PSAzKSB7CiAgICAgICAgICAgIGNpbiA+PiB1ID4+IHYgPj4gdzsKICAgICAgICAgICAgVXBkYXRlQWx0KDEsIDEsIG4sIHUsIHYsIHcpOwogICAgICAgIH0KICAgICAgICBlbGlmICh0eXBlID09IDQpIHsKICAgICAgICAgICAgY2luID4+IHUgPj4gdjsKICAgICAgICAgICAgY291dCA8PCBHZXRTdW0oMSwgMSwgbiwgdSwgdikgPDwgZW5kbDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDA7Cn0K