#include <bits/stdc++.h>
#define lc (x<<1)
#define rc (x<<1|1)
#define mid ((l+r)>>1)
#define DB double
#define rep(i,a,n) for(register int i = (a);i<=(n);++i)
#define ll long long
#define debug "Here!!!->Debug::"
using namespace std;
template<typename T>inline void read(T &x){
char c = getchar();
short int t = 1;x = 0;
for(;!isdigit(c);c = getchar())if(c=='-')t=-1;
for(;isdigit(c);c = getchar())x = (x<<1) + (x<<3) + (c^48);
x*=t;
}
template<typename T>inline void write(T x){
if(x<0){
x = -x;
putchar('-');
}
if(x>=10){
write(x/10);
}
putchar(x%10+'0');
}
const int N = 1e5+10;
const int INF = 2147483647;
const int MOD = 1e9+7;
struct node{
int sum;
int sum1;
}tree[N<<2];
int n = 0,m = 0,a[N],inv[N];
void pushup(int x){
tree[x].sum = (tree[x].sum+tree[x].sum)%MOD;
tree[x].sum1 = (tree[x].sum1 + tree[x].sum1)%MOD;
}
void build(int x,int l,int r){
if(l == r){
tree[x].sum = a[l]%MOD;
tree[x].sum1 = a[l]*a[l]%MOD;
}else{
build(lc,l,mid);
build(rc,mid+1,r);
pushup(x);
}
}
void update(int x,int l,int r,int from,int to,int k){
if(l>=from&&r<=to){
tree[x].sum = k%MOD;
// cout <<debug<<tree[x].sum<<endl;
tree[x].sum1 = k*k%MOD;
}else{
if(mid>=from){
update(lc,l,mid,from,to,k);
}
if(mid<to){
update(rc,mid+1,r,from,to,k);
}
pushup(x);
}
}
int query1(int x,int l,int r,int from,int to){
if(l>=from&&r<=to){
return tree[x].sum;
}
int ans = 0;
if(mid>=from){
ans = (ans + query1(lc,l,mid,from,to));
}
if(mid<to){
ans = (ans + query1(rc,mid+1,r,from,to));
}
return ans%MOD;
}
int query2(int x,int l,int r,int from,int to){
if(l>=from&&r<=to){
return tree[x].sum1;
}
int ans = 0;
if(mid>=from){
ans = (ans + query2(lc,l,mid,from,to));
}
if(mid<to){
ans = (ans + query2(rc,mid+1,r,from,to));
}
return ans%MOD;
}
inline void init(){
inv[0] = inv[1] = 1;
for(int i = 2;i<=n;++i){
inv[i] = (MOD-MOD/i)*inv[MOD%i]%MOD;
}
}
int ksm(int x,int y){
int ans = 1;
while(y){
if(y&1){
ans = ans*x%MOD;
}
x = x*x%MOD;
y>>=1;
}
return ans;
}
signed main(){
read(n);read(m);
init();
for(int i =1;i<=n;++i){
read(a[i]);
}
build(1,1,n);
int opt = 0,l = 0,r = 0;
while(m--){
read(opt);read(l);read(r);
if(opt == 1){
update(1,1,n,l,l,r);
}else{
int len = (r-l)+1;
int sum1 = query1(1,1,n,l,r) *inv[len]%MOD;
cout <<debug<<sum1<<endl;
int sum2 = query2(1,1,n,l,r) *inv[len]%MOD;
write((ll)(sum2 - sum1*sum1%MOD + MOD)%MOD);
putchar('\n');
}
}
return 0;
}
感谢