RT.
#include<iostream>
#include<cmath>
using namespace std;
const int mod=1e9+7;
const int maxn=1e5+10;
int qpow(int p,int times)
{
int ans=1;
while(times)
{
if(times&1)ans=((long long)ans*p%mod);
p=((long long)p*p%mod);
times>>=1;
}
return ans;
}
struct seg
{
long long num[4*maxn];
long long num2[4*maxn];
int the_st[maxn];
inline int lson(int x){return x<<1;}
inline int rson(int x){return (x<<1)|1;}
void build(int now,int l,int r)
{
if(l==r)
{
num[now]=the_st[l]%mod;
num2[now]=(long long)the_st[l]*the_st[l]%mod;
return;
}
int mid=(l+r)>>1;
build(lson(now),l,mid);
build(rson(now),mid+1,r);
num[now]=(num[lson(now)]+num[rson(now)])%mod;
num2[now]=(num2[lson(now)]+num2[rson(now)])%mod;
}
void change(int now,int l,int r,int q,int change_num)
{
if(l==r)
{
num[now]=change_num%mod;
num2[now]=(long long)(change_num*change_num%mod);
return;
}
int mid=(l+r)>>1;
if(mid<q)change(rson(now),mid+1,r,q,change_num);
else change(lson(now),l,mid,q,change_num);
num[now]=(num[lson(now)]+num[rson(now)])%mod;
num2[now]=(num2[lson(now)]+num2[rson(now)])%mod;
}
long long query1(int now,int l,int r,int ql,int qr)
{
if(ql<=l&&r<=qr)
{
return num[now];
}
int mid=(l+r)>>1;
long long ans=0;
if(ql<=mid)ans=query1(lson(now),l,mid,ql,qr);
if(mid<qr)ans=(ans+query1(rson(now),mid+1,r,ql,qr))%mod;
return ans;
}
long long query2(int now,int l,int r,int ql,int qr)
{
if(ql<=l&&r<=qr)
{
return num2[now];
}
int mid=(l+r)>>1;
long long ans=0;
if(ql<=mid)ans=query2(lson(now),l,mid,ql,qr);
if(mid<qr)ans+=query2(rson(now),mid+1,r,ql,qr);
return ans%mod;
}
}seg;
int main()
{
int n,q;
cin>>n>>q;
for(int i=1;i<=n;i++)
{
cin>>seg.the_st[i];
}
seg.build(1,1,n);
for(int i=1,t1,t2,t3;i<=q;i++)
{
cin>>t1>>t2>>t3;
if(t1==1)
{
seg.change(1,1,n,t2,t3);
}
else
{
long long part1=seg.query2(1,1,n,t2,t3)%mod;
long long part2=(long long)qpow(seg.query1(1,1,n,t2,t3),2)%mod*qpow(t3-t2+1,mod-2)%mod;
long long part4=(long long)(part1-part2+mod)%mod*qpow(t3-t2+1,mod-2)%mod;
cout<<part4<<'\n';
}
}
}