#include <bits/stdc++.h>
using namespace std;
const long long SIZE = 100005;
const long long mod = 1e9+7;
long long n, m;
long long a[SIZE];
inline long long rd(){
long long f = 1, x = 0;
char ch = getchar();
while(!isdigit(ch)){
if(ch == '-') f = -1;
ch = getchar();
}
while(isdigit(ch)){
x = x * 10 + (ch - '0');
ch = getchar();
}
return f*x;
}
struct Tree{
long long l, r;
long long sum, sum_2;
}t[SIZE*4];
long long power(long long x, long long y){
long long num = 1ll;
while(y){
if(y & 1) num = num * x % mod;
x = x * x % mod;
y >>= 1;
}
return num % mod;
}
void pushup(long long p){
t[p].sum = (t[p<<1].sum + t[p<<1|1].sum) % mod;
t[p].sum_2 = (t[p<<1].sum_2 + t[p<<1|1].sum_2) % mod;
}
void Build(long long p, long long l, long long r){
t[p].l = l, t[p].r = r;
if(l == r){
t[l].sum = a[l];
t[l].sum_2 = (a[l] * a[l]) % mod;
return;
}
long long mid = (l+r) / 2;
Build(p<<1, l, mid);
Build(p<<1|1, mid+1, r);
pushup(p);
}
void change(long long p, long long x, long long val){
if(t[p].l == t[p].r){
t[p].sum = val;
t[p].sum_2 = (val*val) % mod;
return;
}
long long mid = (t[p].l + t[p].r) / 2;
if(x <= mid) change(p<<1, x, val);
else change(p<<1|1, x, val);
pushup(p);
}
long long ask1(long long p, long long l, long long r){
if(l <= t[p].l && r >= t[p].r) return t[p].sum;
long long mid = (t[p].l + t[p].r) / 2;
long long jl = 0;
if(l <= mid) jl += ask1(p<<1, l, r), jl %= mod;
if(r > mid) jl += ask1(p<<1|1, l, r), jl %= mod;
return jl % mod;
}
long long ask2(long long p, long long l, long long r){
if(l <= t[p].l && r >= t[p].r) return t[p].sum_2;
long long mid = (t[p].l + t[p].r) / 2;
long long jl = 0;
if(l <= mid) jl += ask2(p<<1, l, r), jl %= mod;
if(r > mid) jl += ask2(p<<1|1, l, r), jl %= mod;
return jl % mod;
}
int main(){
n = rd(); m = rd();
for(long long i = 1; i <= n; i++) a[i] = rd() % mod;
Build(1, 1, n);
for(long long i = 1; i <= m; i++){
long long c = rd(), x = rd(), y = rd();
if(c == 1){
y %= mod;
change(1, x, y);
}
else{
long long sum1 = ask1(1, x, y);
long long sum2 = ask2(1, x, y);
long long jl = power(y-x+1, mod-2);
printf("%lld\n", ((((sum2*jl)%mod) - ((power(sum1, 2) * power(jl, 2)) % mod))%mod+mod)%mod);
}
}
return 0;
}