#include<bits/stdc++.h>
using namespace std;
const int mod=1000000007;
long long w[400005],p[400005],a[100005];
int n,m;
void pushup(int u){
w[u]=w[u*2]+w[u*2+1];
p[u]=p[u*2]+p[u*2+1];
}
bool InRange(int L,int R,int l,int r){
return (l<=L)&&(r>=R);
}
bool OutRange(int L,int R,int l,int r){
return (l>R)||(r<L);
}
void build(int u,int L,int R){
if(L==R){
w[u]=a[L];
p[u]=a[L]*w[u];
return;
}
int mid=(L+R)/2;
build(u*2,L,mid);
build(u*2+1,mid+1,R);
pushup(u);
}
long long query(int u,int L,int R,int l,int r){
if(InRange(L,R,l,r)) return w[u];
else if(!OutRange(L,R,l,r)){
int mid=(L+R)/2;
return query(u*2,L,mid,l,r)+query(u*2+1,mid+1,R,l,r);
}else return 0;
}
long long query1(int u,int L,int R,int l,int r){
if(InRange(L,R,l,r)) return p[u];
else if(!OutRange(L,R,l,r)){
int mid=(L+R)/2;
return query1(u*2,L,mid,l,r)+query1(u*2+1,mid+1,R,l,r);
}else return 0;
}
void update(int u,int L,int R,int l,long long x){
if(l==L&&L==R){
w[u]=x;
p[u]=x*x;
return;
}
int mid=(L+R)/2;
if(l<=mid)update(u*2,L,mid,l,x);
else update(u*2+1,mid+1,R,l,x);
pushup(u);
}
long long fastpow(int a,int b=mod-2,int m=mod){
a%=m;
long long res=1;
while(b){
if(b&1)res=res*a%m;
a=a*a%m;
b>>=1;
}
return res;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
build(1,1,n);
for(int i=1,a,b;i<=m;i++){
long long c;
cin>>a>>b>>c;
if(a==1)update(1,1,n,b,c%mod);
else{
long long d=query1(1,1,n,b,c)%mod,e=query(1,1,n,b,c)%mod,f=fastpow(c-b+1,mod-2,mod);
long long g=d*f%mod;
long long h=(d*f%mod-g*g%mod);
h=(h%mod+mod)%mod;
cout<<h<<"\n";
}
}
}