#include<bits/stdc++.h>
using namespace std;
#define int long long
const int p=1000000007;
struct tree{
int l,r,w,w2;
}t[1000000];
int n,m;
bool in(int a,int b,int c,int d){return a<=b&&c<=d;}
bool out(int a,int b,int c,int d){return c<a||d<b;}
int a[1000000],inv[1000000],ave,ans;
int mi(int a,int b,int c){
int ans=1;
while(b){
if(b%2==1) ans*=a,ans%=c;
a*=a,a%=c,b/=2;
}
return ans;
}
void init(){for(int i=1;i<=n;i++) inv[i]=mi(i,p-2,p);}
void build(int u,int L,int R){
t[u].l=L,t[u].r=R;
if(L==R){t[u].w=a[L],t[u].w2=a[L]*a[L]%p; return;}
build(u*2,L,(L+R)/2);
build(u*2+1,(L+R)/2+1,R);
t[u].w=(t[u*2].w+t[u*2+1].w)%p;
t[u].w2=(t[u*2].w2+t[u*2+1].w2)%p;
return;
}
void dlzy(int u,int L,int R,int x){
if(out(L,t[u].l,t[u].r,R))return;
if(in(L,t[u].l,t[u].r,R)){
t[u].w=x,t[u].w2=x*x%p;
return;
}
dlzy(u*2,L,R,x);
dlzy(u*2,L,R,x);
t[u].w=(t[u*2].w+t[u*2+1].w)%p,t[u].w2=(t[u*2].w2+t[u*2+1].w2)%p;
return;
}
int ask(int u,int L,int R){
if(out(L,t[u].l,t[u].r,R)){
return 0;
}
if(in(L,t[u].l,t[u].r,R)){
return t[u].w;
}
t[u].w=(t[u*2].w+t[u*2+1].w)%p,t[u].w2=(t[u*2].w2+t[u*2+1].w2)%p;
return (ask(u*2,L,R)+ask(u*2+1,L,R))%p;
}
int ask2(int u,int L,int R){
if(out(L,t[u].l,t[u].r,R)){
return 0;
}
if(in(L,t[u].l,t[u].r,R)){
return t[u].w2;
}
t[u].w=(t[u*2].w+t[u*2+1].w)%p,t[u].w2=(t[u*2].w2+t[u*2+1].w2)%p;
return (ask2(u*2,L,R)+ask2(u*2+1,L,R))%p;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
for(int i=1;i<=m;i++){
int op;
cin>>op;
if(op==1){
int x,y;
cin>>x>>y;
dlzy(1,x,x,y);
}else{
int x,y;
cin>>x>>y;
int s1=ask(1,x,y),s2=ask2(1,x,y);
ave=s1*inv[y-x+1]%p;
ans=s2*inv[y-x+1]%p-ave*ave%p;
ans=(ans%p+p)%p;
cout<<ans<<endl;
}
}
}