不知道为啥样例没过
#include<bits/stdc++.h>
//#pragma GCC optimize(3, "Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
using namespace std;
#define int long long
#define kg putchar(' ')
#define endl puts("")
inline int read(){
int vis=1,ans=0;
char x=getchar();
while(x<'0'||x>'9'){
if(x=='-')vis=-1;
x=getchar();
}
while(x>='0'&&x<='9'){
ans=ans*10+x-'0';
x=getchar();
}
return vis*ans;
}
inline void print(int x){
if(x<0)putchar('-'),x=-x;
if(x>9)print(x/10);
putchar(x%10+'0');
}
int n=read(),m=read(),opt,x,y;
const int N=1e5+9,Mod=1e9+7;
struct node{
int l,r,sum,ans;
}e[N];
int b[N];
inline void putup(int p){
e[p].sum=(e[p*2].sum+e[p*2+1].sum)%Mod;
e[p].ans=(e[p*2].ans+e[p*2+1].ans)%Mod;
}
inline void build(int p,int l,int r){
e[p].l=l,e[p].r=r;
if(l==r){
e[p].sum=b[l];
e[p].sum=b[l]*b[l];
return;
}
int mid=(l+r)/2;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
putup(p);
}
inline void modify(int p,int x,int y){
if(e[p].r<x||x<e[p].l)return;
if(e[p].l==e[p].r&&e[p].l==x){
e[p].sum=b[e[p].l];
e[p].sum=(b[e[p].l]*b[e[p].l])%Mod;
return;
}
modify(p*2,x,y);
modify(p*2+1,x,y);
putup(p);
}
inline int asksum(int p,int l,int r){
if(e[p].r<l||r<e[p].l)return 0;
if(l<=e[p].l&&e[p].r<=r)return e[p].sum;
return (asksum(p*2,l,r)+asksum(p*2+1,l,r))%Mod;
}
inline int askans(int p,int l,int r){
if(e[p].r<l||r<e[p].l)return 0;
if(l<=e[p].l&&e[p].r<=r)return e[p].ans;
return (askans(p*2,l,r)+askans(p*2+1,l,r))%Mod;
}
inline qpow(int x,int n){
if(n==1)return x;
int last=qpow(x,n/2)%Mod;
if(n&1)return ((last*last)%Mod*x)%Mod;
else return ((last*last)%Mod)%Mod;
}
signed main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
for(int i=1;i<=n;i++){
b[i]=read();
}
build(1,1,n);
while(m--){
opt=read(),x=read(),y=read();
if(opt==1){
b[x]=y;
modify(1,x,y);
}else{
int k=qpow(y-x+1,Mod-2),s=asksum(1,x,y)%Mod,sp=askans(1,x,y)%Mod;
// int tmp1 = sp % Mod * k % Mod; int tmp = s % Mod * k % Mod;
// int ans = tmp1 - tmp * tmp % Mod;
// ans = (ans + Mod * 3) % Mod;
sp = sp * k % Mod; s = s % Mod * k % Mod;
int ans = sp - s * s % Mod;
ans = (ans + 10 * Mod) % Mod;
print(ans),endl;
}
}
return 0;
}