#include<bits/stdc++.h>
#define int __int128
using namespace std;
const int N=4e5+105;
const int mod=1e9+7;
struct node{
int l,r;
int ssum,sum;
}t[N];
inline int read(){
int x=0,f=1;
char c=getchar_unlocked();
while(!isdigit(c)){
if(c=='-')f*=-1;
c=getchar_unlocked();
}
while(isdigit(c)){
x=(x<<3)+(x<<1)+(c^48);
c=getchar_unlocked();
}
return x*f;
}
inline void write(int x){
if(x<0)putchar('-'),x*=-1;
if(x<10)putchar(x+'0');
else write(x/10),putchar(x%10+'0');
}
int n,m;
int a[N];
int ls(int p){return 2*p;}
int rs(int p){return ls(p)+1;}
int gcd(int a,int b){
return __gcd(a,b);
}
int power(int a,int b) {
int ans=1;
while(b){
if (b&1)ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
void build(int l,int r,int p){
t[p].l=l,t[p].r=r;
if(l==r){
t[p].ssum=a[l]*a[l];
t[p].sum=a[l];
t[p].sum%=mod;
t[p].ssum%=mod;
return;
}
int mid=(l+r)/2;
build(l,mid,ls(p));
build(mid+1,r,rs(p));
t[p].ssum=t[ls(p)].ssum+t[rs(p)].ssum;
t[p].sum=t[ls(p)].sum+t[rs(p)].sum;
t[p].sum%=mod;
t[p].ssum%=mod;
}
void change(int x,int p,int k){
if(t[p].l==x&&t[p].r==x){
t[p].ssum=k*k;
t[p].sum=k;
t[p].sum%=mod;
t[p].ssum%=mod;
return;
}
int mid=(t[p].l+t[p].r)/2;
if(x<=mid)change(x,ls(p),k);
else change(x,rs(p),k);
t[p].ssum=t[ls(p)].ssum+t[rs(p)].ssum;
t[p].sum=t[ls(p)].sum+t[rs(p)].sum;
t[p].sum%=mod;
t[p].ssum%=mod;
}
int query1(int l,int r,int p){
int ans=0;
if(t[p].l>=l&&t[p].r<=r)
return t[p].ssum%mod;
int mid=(t[p].l+t[p].r)/2;
if(l<=mid)ans+=query1(l,r,ls(p)),ans%=mod;
if(r>mid)ans+=query1(l,r,rs(p)),ans%=mod;
return ans%mod;
}
int query2(int l,int r,int p){
int ans=0;
if(t[p].l>=l&&t[p].r<=r)
return t[p].sum%mod;
int mid=(t[p].l+t[p].r)/2;
if(l<=mid)ans+=query2(l,r,ls(p)),ans%=mod;
if(r>mid)ans+=query2(l,r,rs(p)),ans%=mod;
return ans%mod;
}
signed main(){
cout.tie(0);
n=read(),m=read();
for(int i=1;i<=n;i++)
a[i]=read();
for(int i=1;i<=n;i++)
a[i]%=mod;
int opt,x,y;
int k;
build(1,n,1);
for(int i=1;i<=m;i++){
opt=read(),x=read(),y=read();
if(opt==1)change(x,1,y);
else {
int p1=query1(x,y,1)%mod,q1=(y-x+1)%mod;
int p2=query2(x,y,1)%mod;
int sum=(((p1%mod)*(q1%mod))-((p2%mod)*(p2%mod)))%mod;
q1*=q1;
q1%=mod;
int k=gcd(sum,q1)%mod;
sum/=k,q1/=k;
int inv=power(q1,mod-2);
sum%=mod,inv%=mod;
write(((sum%mod)*(inv%mod))%mod),cout<<endl;
}
}
}