#include<bits/stdc++.h>
using namespace std;

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

using ll = long long;

const int MOD = 1e9+7;
const int INV2 = (MOD + 1) / 2;
const int N = 2e5+5;

struct Query {
    int type, x, y;
} qs[N];

int n, q;
ll a[N];

namespace Subtask1 {
    bool check() {
        return n <= 200 && q <= 200;
    }
    void solve() {
        for (int i = 0; i < q; i++) {
            if (qs[i].type == 1) {
                int k = qs[i].x, x = qs[i].y;
                a[k] = x;
            } else {
                int l = qs[i].x, r = qs[i].y;
                ll ans = 0;
                for (int i = l; i <= r; i++)
                    for (int j = i + 1; j <= r; j++)
                        ans = (ans + a[i] * a[j] % MOD) % MOD;
                cout << ans << '\n';
            }
        }
    }
}

namespace Subtask2 {
    ll P[N], P2[N];
    bool check() {
        for (int i = 0; i < q; i++)
            if (qs[i].type == 1) return false;
        return true;
    }
    void solve() {
        for (int i = 1; i <= n; i++) {
            P[i] = P[i - 1] + a[i];
            P2[i] = P2[i - 1] + (a[i] * a[i]);
        }
        for (int i = 0; i < q; i++) {
            int l = qs[i].x, r = qs[i].y;
            ll S1 = (P[r] - P[l - 1] + MOD) % MOD, S2 = (P2[r] - P2[l - 1] + MOD) % MOD;
            cout << (S1 * S1 % MOD - S2 + MOD) % MOD * INV2 % MOD << '\n';
        }
    }
}

namespace Fulltask {
    void solve() {

    }
}

void solve() {
    cin >> n >> q;
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 0; i < q; i++) {
        int type, x, y; cin >> type >> x >> y;
        qs[i] = {type, x, y};
    }
    if (Subtask1::check()) Subtask1::solve();
    else if (Subtask2::check()) Subtask2::solve();
    else Fulltask::solve();
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL);

    #define TASK "STSYS"
    if (fopen(TASK".INP", "r")) {
        freopen(TASK".INP", "r", stdin);
        freopen(TASK".OUT", "w", stdout);
    }

    int tests = 1; // cin >> tests;
    while (tests--) solve();

    #ifdef LOCAL
    cerr << "\nTime elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
    #endif
    return 0;
}
