#include<bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for (int i = (a), _b = (b); i <= _b; i++)
#define FORD(i, a, b) for (int i = (a), _b = (b); i >= _b; i--)
using ll = long long;
template<typename X, typename Y>
bool chmax(X& a, Y b) { return (a < b) ? a = b, 1 : 0; }
template<typename X, typename Y>
bool chmin(X& a, Y b) { return (a > b) ? a = b, 1 : 0; }
const int MOD = 1e9 + 7;
inline ll Add(ll a, ll b) { return (a + b) % MOD; }
inline ll Sub(ll a, ll b) { return (a - b + MOD) % MOD; }
inline ll Mul(ll a, ll b) { return a * b % MOD; }
const int MAXN = 2e5 + 5;
const int MAXK = 5;
int N, Q;
ll A[MAXN];
ll C[MAXK+5][MAXK+5], bit[MAXK+5][MAXN];
void precompute() {
FOR(i, 0, MAXK) {
C[i][0] = 1;
FOR(j, 1, i) C[i][j] = Add(C[i - 1][j - 1], C[i - 1][j]);
}
}
void add(int m, int p, ll v) {
v = (v % MOD + MOD) % MOD;
for (; p <= N; p += p & -p) bit[m][p] += v;
}
ll get(int m, int p) {
ll res = 0;
for (; p > 0; p -= p & -p) res += bit[m][p];
return res;
}
ll query(int m, int l, int r) {
return Sub(get(m, r), get(m, l - 1));
}
void update(int i, ll x) {
x = (x % MOD + MOD) % MOD;
ll P = 1, V = 1;
FOR(m, 1, MAXK) {
P = Mul(P, A[i]);
V = Mul(V, x);
add(m, i, Sub(V, P));
}
A[i] = x;
}
void solve() {
cin >> N >> Q;
FOR(i, 1, N) {
cin >> A[i];
A[i] = (A[i] % MOD + MOD) % MOD;
add(0, i, 1);
ll P = 1;
FOR(m, 1, MAXK) {
P = Mul(P, A[i]);
add(m, i, P);
}
}
while (Q--) {
int type; cin >> type;
if (type == 1) {
int i, v; cin >> i >> v;
update(i, v);
} else {
int l, r, k; cin >> l >> r >> k;
ll S[MAXK+5];
FOR(m, 0, k) S[m] = query(m, l, r);
ll ans = 0;
FOR(m, 0, k) ans = Add(ans, Mul(C[k][m], Mul(S[m], S[k - m])));
cout << ans << "\n";
}
}
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL);
// freopen("SUM.INP", "r", stdin);
// freopen("SUM.OUT", "w", stdout);
precompute();
int tests = 1; // cin >> tests;
while (tests--) solve();
#ifdef LOCAL
cerr << "\nTime elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
#endif
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgRk9SKGksIGEsIGIpIGZvciAoaW50IGkgPSAoYSksIF9iID0gKGIpOyBpIDw9IF9iOyBpKyspCiNkZWZpbmUgRk9SRChpLCBhLCBiKSBmb3IgKGludCBpID0gKGEpLCBfYiA9IChiKTsgaSA+PSBfYjsgaS0tKQoKdXNpbmcgbGwgPSBsb25nIGxvbmc7Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBYLCB0eXBlbmFtZSBZPgpib29sIGNobWF4KFgmIGEsIFkgYikgeyByZXR1cm4gKGEgPCBiKSA/IGEgPSBiLCAxIDogMDsgfQp0ZW1wbGF0ZTx0eXBlbmFtZSBYLCB0eXBlbmFtZSBZPgpib29sIGNobWluKFgmIGEsIFkgYikgeyByZXR1cm4gKGEgPiBiKSA/IGEgPSBiLCAxIDogMDsgfQoKY29uc3QgaW50IE1PRCA9IDFlOSArIDc7CmlubGluZSBsbCBBZGQobGwgYSwgbGwgYikgeyByZXR1cm4gKGEgKyBiKSAlIE1PRDsgfQppbmxpbmUgbGwgU3ViKGxsIGEsIGxsIGIpIHsgcmV0dXJuIChhIC0gYiArIE1PRCkgJSBNT0Q7IH0KaW5saW5lIGxsIE11bChsbCBhLCBsbCBiKSB7IHJldHVybiBhICogYiAlIE1PRDsgfQoKY29uc3QgaW50IE1BWE4gPSAyZTUgKyA1Owpjb25zdCBpbnQgTUFYSyA9IDU7CgppbnQgTiwgUTsKbGwgQVtNQVhOXTsKCmxsIENbTUFYSys1XVtNQVhLKzVdLCBiaXRbTUFYSys1XVtNQVhOXTsKCnZvaWQgcHJlY29tcHV0ZSgpIHsKICAgIEZPUihpLCAwLCBNQVhLKSB7CiAgICAgICAgQ1tpXVswXSA9IDE7CiAgICAgICAgRk9SKGosIDEsIGkpIENbaV1bal0gPSBBZGQoQ1tpIC0gMV1baiAtIDFdLCBDW2kgLSAxXVtqXSk7CiAgICB9Cn0KCnZvaWQgYWRkKGludCBtLCBpbnQgcCwgbGwgdikgewogICAgdiA9ICh2ICUgTU9EICsgTU9EKSAlIE1PRDsKICAgIGZvciAoOyBwIDw9IE47IHAgKz0gcCAmIC1wKSBiaXRbbV1bcF0gKz0gdjsKfQoKbGwgZ2V0KGludCBtLCBpbnQgcCkgewogICAgbGwgcmVzID0gMDsKICAgIGZvciAoOyBwID4gMDsgcCAtPSBwICYgLXApIHJlcyArPSBiaXRbbV1bcF07CiAgICByZXR1cm4gcmVzOwp9CgpsbCBxdWVyeShpbnQgbSwgaW50IGwsIGludCByKSB7CiAgICByZXR1cm4gU3ViKGdldChtLCByKSwgZ2V0KG0sIGwgLSAxKSk7Cn0KCnZvaWQgdXBkYXRlKGludCBpLCBsbCB4KSB7CiAgICB4ID0gKHggJSBNT0QgKyBNT0QpICUgTU9EOwogICAgbGwgUCA9IDEsIFYgPSAxOwogICAgRk9SKG0sIDEsIE1BWEspIHsKICAgICAgICBQID0gTXVsKFAsIEFbaV0pOwogICAgICAgIFYgPSBNdWwoViwgeCk7CiAgICAgICAgYWRkKG0sIGksIFN1YihWLCBQKSk7CiAgICB9CiAgICBBW2ldID0geDsKfQoKdm9pZCBzb2x2ZSgpIHsKICAgIGNpbiA+PiBOID4+IFE7CiAgICBGT1IoaSwgMSwgTikgewogICAgICAgIGNpbiA+PiBBW2ldOwogICAgICAgIEFbaV0gPSAoQVtpXSAlIE1PRCArIE1PRCkgJSBNT0Q7CiAgICAgICAgYWRkKDAsIGksIDEpOwogICAgICAgIGxsIFAgPSAxOwogICAgICAgIEZPUihtLCAxLCBNQVhLKSB7CiAgICAgICAgICAgIFAgPSBNdWwoUCwgQVtpXSk7CiAgICAgICAgICAgIGFkZChtLCBpLCBQKTsKICAgICAgICB9CiAgICB9CiAgICB3aGlsZSAoUS0tKSB7CiAgICAgICAgaW50IHR5cGU7IGNpbiA+PiB0eXBlOwogICAgICAgIGlmICh0eXBlID09IDEpIHsKICAgICAgICAgICAgaW50IGksIHY7IGNpbiA+PiBpID4+IHY7CiAgICAgICAgICAgIHVwZGF0ZShpLCB2KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbnQgbCwgciwgazsgY2luID4+IGwgPj4gciA+PiBrOwogICAgICAgICAgICBsbCBTW01BWEsrNV07CiAgICAgICAgICAgIEZPUihtLCAwLCBrKSBTW21dID0gcXVlcnkobSwgbCwgcik7CiAgICAgICAgICAgIGxsIGFucyA9IDA7CiAgICAgICAgICAgIEZPUihtLCAwLCBrKSBhbnMgPSBBZGQoYW5zLCBNdWwoQ1trXVttXSwgTXVsKFNbbV0sIFNbayAtIG1dKSkpOwogICAgICAgICAgICBjb3V0IDw8IGFucyA8PCAiXG4iOyAgICAKICAgICAgICB9CiAgICB9Cn0KCmludCBtYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IGNpbi50aWUoTlVMTCk7CgogICAgLy8gZnJlb3BlbigiU1VNLklOUCIsICJyIiwgc3RkaW4pOwogICAgLy8gZnJlb3BlbigiU1VNLk9VVCIsICJ3Iiwgc3Rkb3V0KTsKCiAgICBwcmVjb21wdXRlKCk7CgogICAgaW50IHRlc3RzID0gMTsgLy8gY2luID4+IHRlc3RzOwogICAgd2hpbGUgKHRlc3RzLS0pIHNvbHZlKCk7CgogICAgI2lmZGVmIExPQ0FMCiAgICBjZXJyIDw8ICJcblRpbWUgZWxhcHNlZDogIiA8PCAxLjAgKiBjbG9jaygpIC8gQ0xPQ0tTX1BFUl9TRUMgPDwgIiBzLlxuIjsKICAgICNlbmRpZgogICAgcmV0dXJuIDA7Cn0K