#include<bits/stdc++.h>
#define int long long
#define mod 1000000007
using namespace std;
int n,m,a[10000005];
struct node{
int sum,summ;
}tree[5000005];
void build(int x,int y,int p){
if(x==y){
tree[p].sum=a[x]%mod;
tree[p].summ=(a[x]*a[x])%mod;
return ;
}
int mid=(x+y)/2;
build(x,mid,p*2);
build(mid+1,y,p*2+1);
tree[p].sum=(tree[p*2].sum+tree[p*2+1].sum)%mod;
tree[p].summ=(tree[p*2].summ+tree[p*2+1].summ)%mod;
}
void change(int x,int y,int s,int k,int p){
if(x==y){
tree[p].sum=k%mod;
tree[p].summ=k*k%mod;
return ;
}
int mid=(x+y)/2;
if(mid>=s) change(x,mid,s,k,p*2);
if(mid<s) change(mid+1,y,s,k,p*2+1);
tree[p].sum=(tree[p*2].sum+tree[p*2+1].sum)%mod;
tree[p].summ=(tree[p*2].summ+tree[p*2+1].summ)%mod;
}
node find(int x,int y,int s,int t,int p){
if(x>=s&&y<=t){
return tree[p];
}
int mid=(x+y)/2;
if(mid<s) find(mid+1,y,s,t,p*2+1);
if(mid>=t) find(x,mid,s,t,p*2);
else {
node al,bl,ans;
al=find(x,mid,s,t,p*2);
bl=find(mid+1,y,s,t,p*2+1);
ans.sum=(al.sum+bl.sum)%mod;
ans.summ=(al.summ+bl.summ)%mod;
return ans;
}
}
int qpow(int b, int p = mod - 2, int m = mod) {
b %= m;
int s = 1 % m;
for(; p; p >>= 1, b = b * b % m)
if(p & 1) s = s * b % m;
return s;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,n,1);
for(int i=1;i<=m;i++){
int op;
cin>>op;
if(op==1){
int x,k;
cin>>x>>k;
change(1,n,x,k,1);
}
if(op==2){
int l,r;
cin>>l>>r;
node num=find(1,n,l,r,1);
int k=qpow(r-l+1);
cout<<(num.summ*k+mod+mod-num.sum*num.sum*k*k%mod)%mod<<endl;
}
}
return 0;
}