样例已过,能取模的都取了,不到哪里出了锅
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<queue>
#include<stack>
#include<cstdlib>
#include<iomanip>
#include<map>
#define int long long
#define db long double
#define pii pair<int,int>
#define up(i,l,r) for(int i=(l);i<=(r);i++)
#define down(i,l,r) for(int i=(l);i>=(r);--i)
#define p_b push_back
#define m_p make_pair
using namespace std;
int mod=1e9+7;
int b[100007];
int sum[100007];
int s[100007];
int sqs[100007];
int sqsum[100007];
int n,m;
int qpow(int a,int b){
if(b==1)return a;
int ans=1;
if(b&1){
int u=qpow(a,b/2);
ans=ans*u%mod;
ans=ans*u%mod;
ans=ans*a%mod;
return ans;
}
else{
int u=qpow(a,b/2);
ans=ans*u%mod;
ans=ans*u%mod;
return ans;
}
}
int inv(int a){
return qpow(a,mod-2);
}
int lowbit(int x){
return x&-x;
}
int getsum(int r){
int ans=0;
while(r>0){
ans+=s[r];
ans%=mod;
r-=lowbit(r);
}
return ans;
}
int getsqs(int r){
int ans=0;
while(r>0){
ans+=sqs[r];
ans%=mod;
r-=lowbit(r);
}
return ans;
}
int qsum(int l,int r){
return ((getsum(r)%mod-getsum(l-1)%mod)%mod+mod)%mod;
}
int qsqs(int l,int r){
return ((getsqs(r)%mod-getsqs(l-1)%mod)%mod+mod)%mod;
}
int var(int l,int r){
int sm=qsum(l,r);
int sqs=qsqs(l,r);
int len=r-l+1;
// cout<<sm<<" "<<sqs<<" "<<len<<endl;
int fz=((sqs%mod*len%mod-sm%mod*sm%mod)%mod+mod)%mod;
int fm=len%mod*len%mod;
// cout<<fz<<" "<<fm<<endl;
return inv(fm)%mod*fz%mod;
}
void upd(int x,int y){
int u=b[x];
while(x<=n){
s[x]+=(y-u)%mod;
sqs[x]+=((y-u)%mod*((y+u)%mod)%mod);
sqs[x]%=mod;
s[x]%=mod;
x+=lowbit(x);
}
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>b[i];
sum[i]=(sum[i-1]+b[i])%mod;
sqsum[i]=(sqsum[i-1]+b[i]%mod*b[i]%mod)%mod;
}
for(int i=1;i<=n;i++){
s[i]=((sum[i]%mod-sum[i-lowbit(i)]%mod)%mod+mod)%mod;
sqs[i]=((sqsum[i]%mod-sqsum[i-lowbit(i)]%mod)%mod+mod)%mod;
}
for(int i=1;i<=m;i++){
int op;
cin>>op;
if(op==1){
int x,y;
cin>>x>>y;
upd(x,y);
}
else{
int l,r;
cin>>l>>r;
cout<<var(l,r)<<endl;
}
}
}