#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,q;
ll a[200100];
struct node{
ll l,r;
ll sum1,sum2;
}tr[1001000];
const ll p=1e9+7;
double qumi(ll a,ll b){
ll res=1;
while(b){
if (b%2)
res=res*a%p;
a=a*a%p;
b>>=1;
}
return res;
}
void pushup(ll x){
tr[x].sum1=tr[x<<1].sum1+tr[x<<1|1].sum1;
tr[x].sum2=tr[x<<1].sum2+tr[x<<1|1].sum2;
}
void build(ll x,ll l,ll r){
tr[x].l=l;
tr[x].r=r;
if (l==r){
tr[x].sum1=a[l];
tr[x].sum2=(a[l]*a[l])%p;
return;
}
ll mid=l+r>>1;
build(x<<1,l,mid);
build(x<<1|1,mid+1,r);
pushup(x);
}
void change1(ll x,ll k,ll d){
if (tr[x].l==tr[x].r){
tr[x].sum1*=d;
tr[x].sum2*=d;
return;
}
ll mid=tr[x].l+tr[x].r>>1;
if (tr[x<<1].l<=k && k<=tr[x<<1].r)
change1(x<<1,k,d);
if (tr[x<<1|1].l<=k && k<=tr[x<<1|1].r)
change1(x<<1|1,k,d);
pushup(x);
}
void change2(ll x,ll k,ll d){
if (tr[x].l==tr[x].r){
tr[x].sum1+=d;
(tr[x].sum2+=d*d)%=p;
return;
}
ll mid=tr[x].l+tr[x].r>>1;
if (tr[x<<1].l<=k && k<=tr[x<<1].r)
change2(x<<1,k,d);
if (tr[x<<1|1].l<=k && k<=tr[x<<1|1].r)
change2(x<<1|1,k,d);
pushup(x);
}
ll ask1(ll x,ll l,ll r){
if (l<=tr[x].l && tr[x].r<=r){
return tr[x].sum1;
}
ll mid=tr[x].l+tr[x].r>>1;
ll res=0;
if (l<=mid)
res+=ask1(x<<1,l,r);
if (mid+1<=r)
res+=ask1(x<<1|1,l,r);
return res;
}
ll ask2(ll x,ll l,ll r){
if (l<=tr[x].l && tr[x].r<=r){
return tr[x].sum2;
}
ll mid=tr[x].l+tr[x].r>>1;
ll res=0;
if (l<=mid)
res+=ask2(x<<1,l,r);
if (mid+1<=r)
res+=ask2(x<<1|1,l,r);
return res;
}
int main(){
cin>>n>>q;
for (int i=1;i<=n;i++){
cin>>a[i];
a[i]%=p;
}
build(1,1,n);
while(q--){
ll opt,l,r;
cin>>opt;
if (opt==1){
cin>>l>>r;
change1(1,l,0);
change2(1,l,r);
}else{
cin>>l>>r;
double sum1=ask1(1,l,r);
double sum2=ask2(1,l,r);
double num1=sum2-2*sum1/(r-l+1)*sum1+(r-l+1)*(sum1/(r-l+1))*(sum1/(r-l+1));
ll num2=r-l+1;
cout<<(ll)(num1*qumi(num2,p-2))%p<<endl;
}
}
}