#include<bits/stdc++.h>
#define int long long
#define lowbit(i) i&(-i)
using namespace std;
const int mod=1e9+7;
int quick_pow(int x,int k){
x%=mod;
int res=1;
while(k){
if(k&1){
res=res*x%mod;
}
x=x*x%mod;
k>>=1;
}
return res;
}
int inv(int x){
return quick_pow(x,mod-2);
}
int a[100010],tree1[100010],tree2[100010],n,t;
void query(int x,int y){
for(int i=x;i<=n;i+=lowbit(i)){
tree1[i]=(((tree1[i]+y)%mod)+mod)%mod;
tree2[i]=((tree2[i]+y*abs(y)%mod)+mod)%mod;
}
}
int sum1(int x){
int sum=0;
for(int i=x;i;i-=lowbit(i)){
sum=(sum+tree1[i])%mod;
}
return sum;
}
int sum2(int x){
int sum=0;
for(int i=x;i;i-=lowbit(i)){
sum=(sum+tree2[i])%mod;
}
return sum;
}
int ask_sum1(int l,int r){
return sum1(r)-sum1(l-1);
}
int ask_sum2(int l,int r){
return sum2(r)-sum2(l-1);
}
signed main(){
cin>>n>>t;
for(int i=1;i<=n;i++){
cin>>a[i];
query(i,a[i]);
}
while(t--){
int opt,x,y;
cin>>opt>>x>>y;
if(opt==1){
query(x,y);
}
else{
int ans1=ask_sum1(x,y)%mod;
int ans2=ask_sum2(x,y)%mod;
// cout<<ans1<<" "<<ans2<<endl;
int IAKIOI=inv(y-x+1)%mod;
ans1=ans1%mod*IAKIOI%mod,ans2=ans2%mod*IAKIOI%mod;
int ans=(ans2-ans1%mod*ans1%mod+mod)%mod;
ans=((ans+mod*10)%mod+mod)%mod;
cout<<ans<<endl;
}
}
return 0;
}
RT.估计是取模的问题