#include<iostream>
#define ll long long
#define N 100005
using namespace std;
int n,m;
const ll p=1e9+7;
ll f[N],g[N],c[N];
ll lb(ll x){//lowbit
return x&-x;
}
ll qp(ll a,ll b){//quick_pow
if(b==0) return 1ll;
ll x=qp(a*a%p,b/2)%p;
return b%2?x*a%p:x%p;
}
void add(ll x,ll y,ll b[]){
while(x<=n){
b[x]=((b[x]+y)%p+p)%p;
x+=lb(x);
}
}
ll query(ll x,ll b[]){
ll ans=0;
while(x){
ans=(ans+b[x])%p;
x-=lb(x);
}
return ans;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>c[n];
add(i,c[n]%p,f);
add(i,c[n]*c[n]%p,g);
}
for(int i=1,ch;i<=m;i++){
long long x,y;
cin>>ch>>x>>y;
if(ch==1){
add(x,(y*y%p-c[x]*c[x]%p+p)%p,g);
add(x,(y-c[x]+p)%p,f);
c[x]=y;
}else{
ll s=(query(y,f)-query(x-1,f)+p)%p;//和
ll t=(query(y,g)-query(x-1,g)+p)%p;//平方和
ll q=y-x+1;
ll fz=(q*t%p-s*s%p+p)%p;//分子
ll fm=q*q%p;//分母
cout<<fz*qp(fm,p-2)%p<<endl;
}
}
return 0;
}