#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define all(x) x.begin(),x.end()
#define foo(i,a,b) for(int i=a;i<=b;i++)
#define fro(i,a,b) for(int i=a;i>=b;i--)
#define l(x) ((x)<<1)
#define r(x) ((x)<<1|1)
#define int long long
const int N=5e5+10;
typedef pair<int,int> PII;
typedef long long LL;
const int mod=1e9+7;
int n,m;
int a[N];
LL qmi(LL a,LL b)
{
LL ans=1;
while(b)
{
if(b&1)ans=ans*a%mod;
a=(LL)a*a%mod;
b>>=1;
}
return (ans%mod+mod)%mod;
}
struct
{
int l,r;
LL sum1,sum2;
}tr[4*N];
void pushup(int x)
{
tr[x].sum1=((tr[l(x)].sum1+tr[r(x)].sum1)%mod+mod)%mod;
tr[x].sum2=((tr[l(x)].sum2+tr[r(x)].sum2)%mod+mod)%mod;
}
void build(int x,int l,int r)
{
tr[x].l=l,tr[x].r=r;
if(l==r)
{
tr[x].sum1=((a[l])%mod+mod)%mod;
tr[x].sum2=(((LL)a[l]*a[l])%mod+mod)%mod;
return;
}
int mid=l+r>>1;
build(l(x),l,mid);
build(r(x),mid+1,r);
pushup(x);
}
PII ask(int x,int l,int r)
{
if(tr[x].l>=l&&tr[x].r<=r)return {tr[x].sum1%mod,tr[x].sum2%mod};
int mid=tr[x].l+tr[x].r>>1;
PII t={0ll,0ll};
if(l<=mid)t=ask(l(x),l,r);
if(r>mid)
{
auto j=ask(r(x),l,r);
t.first=(((t.first+j.first))%mod+mod)%mod;
t.second=(((t.second+j.second))%mod+mod)%mod;
}
return t;
}
int query(int x,int l,int r)
{
PII t=ask(x,l,r);
int sum1=t.first%mod,sum2=t.second%mod;
int n=r-l+1;
LL n1=qmi(n,mod-2),n2=n1*n1%mod;
assert(n1>=0&&n2>=0);
return ((LL)n*sum2-(LL)sum1*sum1)*n2%mod;
}
void change(int x,int k,int c)
{
if(tr[x].l==tr[x].r)
{
tr[x].sum1=c%mod;
tr[x].sum2=(LL)c*c%mod;
return;
}
int mid=tr[x].l+tr[x].r>>1;
if(k<=mid)change(l(x),k,c);
else change(r(x),k,c);
pushup(x);
}
signed main()
{
ios::sync_with_stdio(false); cin.tie(0);
cin>>n>>m;
foo(i,1,n)cin>>a[i];
build(1,1,n);
int c,x,y;
while(m--)
{
cin>>c>>x>>y;
if(c==1)change(1,x,y);
else cout<<(query(1,x,y)%mod+mod)%mod<<'\n';
}
}