#include <bits/stdc++.h>
#define int long long
#define lowbit(x) x&-x
using namespace std;
constexpr int mod=1e9+7;
int n,m,b[100005],c,x,y;
int tr[3][100005];//tr[1]维护区间和,tr[2]维护区间平方和
int qpow(int x,int n){//快速幂
int res=1;
while (n){
if (n&1){
res=(res*x)%mod;
}
n=n>>1;
x=(x*x)%mod;
}
return res%mod;
}
void change(int i,int k){//单点修改
int t=i;
while (t<=n){
tr[1][t]+=k;
t+=lowbit(t);
}
t=i;
while (t<=n){
tr[2][t]+=(b[t]+k)*(b[t]+k)-b[t]*b[t];
t+=lowbit(t);
}
return;
}
int query(int x,int op){//区间查询
int res=0;
while (x>0){
res+=tr[op][x];
x-=lowbit(x);
}
return res;
}
int inq(int x,int y,int op){
return query(y,op)-query(x-1,op);
}
signed main(){
cin>>n>>m;
for (int i=1;i<=n;i++){
cin>>b[i];
change(i,b[i]);
}
while (m--){
cin>>c>>x>>y;
if (c==1){
change(x,y-b[x]);
b[x]=y;
}else{
int a=inq(x,y,2)*(y-x+1)%mod-inq(x,y,1)*inq(x,y,1)%mod;
int b=(y-x+1)*(y-x+1)%mod;
cout<<(a*qpow(b,mod-2)%mod+mod)%mod<<'\n';//求逆元 & ans
}
}
return 0;
}
马蜂恶臭,还请见谅(qwq