#include<bits/stdc++.h>
#define mod 1000000007
#define int long long
#define N 100010
#define ls (p<<1)
#define rs (p<<1|1)
#define mid (l+r>>1)
using namespace std;
int n,m;
int a[N],tr[N*4],ptr[N*4],lz[N*4];
inline int read(){
int x=0,f=1;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
int qpow(int x,int b){
int res=1;
while(b){if(b&1)res=res*x%mod;x<<=1,x%=mod,b>>=1;}
return res;
}
void build(int p,int l,int r){
if(l==r){tr[p]=a[l];ptr[p]=a[l]*a[l];return;}
build(ls,l,mid);build(rs,mid+1,r);
tr[p]=tr[ls]+tr[rs];ptr[p]=ptr[ls]+ptr[rs];
}
void modify_area(int p,int l,int r,int pos,int x){
if(l==r){ptr[p]=ptr[p]+2*x*tr[p]+x*x*(r-l+1);tr[p]+=x*(r-l+1);return;}
if(pos<=mid)modify_area(ls,l,mid,pos,x);else modify_area(rs,mid+1,r,pos,x);
ptr[p]=ptr[ls]+ptr[rs];tr[p]=tr[ls]+tr[rs];
}
int query1(int p,int l,int r,int ql,int qr){
if(l>qr||r<ql)return 0;
if(l>=ql&&r<=qr)return tr[p];
return query1(ls,l,mid,ql,qr)+query1(rs,mid+1,r,ql,qr);
}
int query2(int p,int l,int r,int ql,int qr){
if(l>qr||r<ql)return 0;
if(l>=ql&&r<=qr)return ptr[p];
return query2(ls,l,mid,ql,qr)+query2(rs,mid+1,r,ql,qr);
}
int variance(int p,int l,int r,int ql,int qr){
int q1=query1(p,l,r,ql,qr)%mod;
int q2=query2(p,l,r,ql,qr)%mod;
int inv=qpow((qr-ql+1),mod-2);
int ave=q1*inv%mod;
int ans=q2*inv%mod-ave*ave%mod;
return (ans%mod+mod)%mod;
}
signed main(){
n=read();m=read();
for(int i=1;i<=n;i++)a[i]=read();
build(1,1,n);
for(int t=1;t<=m;t++){
int type=read(),x=read(),y=read();
if(type==1)modify_area(1,1,n,x,y);
if(type==2){printf("%lld\n",variance(1,1,n,x,y));}
}
return 0;
}