#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
#define ll long long
const ll mod=1e9+7;
int n,m;
ll a[N];
struct data{ll Sum,SqrSum;};
void exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0){x=1;y=0;return;}
exgcd(b,a%b,y,x);
y-=(a/b)*x;
}
ll inv(ll x)
{
ll ansx,ansy;
exgcd(x,mod,ansx,ansy);
return (ansx%mod+mod)%mod;
}
struct Segment_Tree
{
data t[N<<2];
data SetClear(){data res;res.SqrSum=res.Sum=0;return res;}
data mix(data x,data y)
{
data res=SetClear();
res.Sum=(x.Sum+y.Sum)%mod;
res.SqrSum=(x.SqrSum+y.SqrSum)%mod;
return res;
}
void up(int k){t[k]=mix(t[k<<1],t[k<<1|1]);}
void build(int k,int l,int r)
{
if(l==r)
{
t[k].Sum=a[l]%mod;
t[k].SqrSum=(a[l]*a[l])%mod;
return;
}
int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
up(k);
}
void add(int k,int l,int r,int q,ll v)
{
if(l==r)
{
t[k].Sum=v%mod;
t[k].SqrSum=(v*v)%mod;
return;
}
int mid=(l+r)>>1;
if(q<=mid)add(k<<1,l,mid,q,v);
else add(k<<1|1,mid+1,r,q,v);
up(k);
}
data ask(int k,int l,int r,int ql,int qr)
{
if(ql<=l&&r<=qr)return t[k];
data res=SetClear();
int mid=(l+r)>>1;
if(ql<=mid)res=mix(res,ask(k<<1,l,mid,ql,qr));
if(qr>mid)res=mix(res,ask(k<<1|1,mid+1,r,ql,qr));
return res;
}
void var(int l,int r)
{
data res=ask(1,1,n,l,r);
ll AnsNume,AnsDeno;
AnsNume=(res.SqrSum*(r-l+1)-res.Sum*res.Sum);
AnsNume=(AnsNume%mod+mod)%mod;
AnsDeno=((r-l+1)*(r-l+1))%mod;
printf("%lld\n",AnsNume*inv(AnsDeno)%mod);
}
}T;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
T.build(1,1,n);
while(m--)
{
int op;
scanf("%d",&op);
if(op==1)
{
int q;ll k;
scanf("%d%lld",&q,&k);
T.add(1,1,n,q,k);
}
if(op==2)
{
int l,r;
scanf("%d%d",&l,&r);
if(l>r)swap(l,r);
T.var(l,r);
}
}
return 0;
}