#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 1e9 + 7;
const int N = 1e5 + 10;
int qpow (int b,int p = mod - 2,int m = mod) {
b %= m;
int s = 1 % m;
for (; p; p >> 1, b = b * b % m) {
if (p & 1) s = s * b % m;
}
return s;
}
int n, m;
int b[N];
struct Node {
int l, r, pans, ans;
}tr[N * 4];
void change(int p, int k, int v){
if(tr[p].l > k || tr[p].r < k) return ;
if(tr[p].l == tr[p].r){
tr[p].pans = v * v % mod;
tr[p].ans = v % mod;
return ;
}
change(p << 1, k, v);
change(p << 1 | 1, k ,v);
tr[p].pans = tr[p << 1].pans + tr[p << 1 | 1].pans;
tr[p].pans %= mod;
tr[p].ans = tr[p << 1].ans + tr[p << 1 | 1].ans;
tr[p].ans %= mod;
}
void build (int p, int l, int r){
tr[p] = {l, r, 0, 0};
if (l == r) {
tr[p].ans = b[l] % mod;
tr[p].pans = b[l] * b[l] % mod;
return ;
}
int mid = l + r >> 1 ;
build(p << 1, l, mid);
build(p << 1 | 1, mid + 1, r);
tr[p].ans = tr[p << 1].ans + tr[p << 1 | 1].ans;
tr[p].ans %= mod;
tr[p].pans = tr[p << 1].pans + tr[p << 1 | 1].pans;
tr[p].pans %= mod;
}
int query1(int p, int l, int r){
if(tr[p].l >= l && tr[p].r <= r) return tr[p].ans % mod;
if(tr[p].l > r || tr[p].r < l) return 0;
return (query1(p << 1, l, r) + query1(p << 1 | 1, l, r)) % mod;
}
int query2(int p, int l, int r){
if(tr[p].l >= l && tr[p].r <= r) return tr[p].pans % mod;
if(tr[p].l > r || tr[p].r < l) return 0;
return (query2(p << 1, l, r) + query2(p << 1 | 1, l, r)) % mod;
}
signed main() {
scanf("%lld %lld",&n, &m);
for (int i = 1 ; i <= n ; ++ i) scanf("%lld",&b[i]);
build(1, 1, n);
for (int i = 1 ; i <= m ; ++ i){
int op, x, y;
scanf("%lld %lld %lld",&op, &x, &y);
if (op == 1) change(1, x, y);
if (op == 2){
int ans1 = query1(1, x, y);
int ans2 = query2(1, x, y);
int inv = qpow(y - x + 1);
int ave = ans1 * inv % mod;
int ans = ans2 * inv %mod - ave * ave % mod;
ans = (ans % mod + mod) % mod;
printf("%lld\n",ans);
}
}
}