#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;
}
