捞(为桂子山)
  • 板块题目总版
  • 楼主TC_QD
  • 当前回复2
  • 已保存回复2
  • 发布时间2025/7/20 08:35
  • 上次更新2025/7/20 15:52:22
查看原帖
捞(为桂子山)
1335720
TC_QD楼主2025/7/20 08:35

马蜂恶臭,还请见谅(qwq

原题传送门

#include <bits/stdc++.h>
#define int long long
#define lowbit(x) x&-x
using namespace std;
constexpr int mod=1e9+7;
int n,m,b[100005],c,x,y;
int tr1[100005],tr2[100005];//tr1维护区间和,tr2维护区间平方和
int qpow(int x,int n){//快速幂(求逆元)
	int res=1;
	while (n){
		if (n&1){
			res=(res*x)%mod;
		}
		n=n>>1;
		x=(x*x)%mod;
	}
	return res%mod;
}
int query1(int x){//区间和
    int res=0;
    while (x>0){
        res+=tr1[x];
        x-=lowbit(x);
    }
    return res%mod;
}
int query2(int x){//区间平方和
    int res=0;
    while (x>0){
        res+=tr2[x];
        x-=lowbit(x);
    }
    return res%mod;
}
int inq1(int x,int y){
    return (query1(y)-query1(x-1)%mod+mod)%mod;
}
int inq2(int x,int y){
    return (query2(y)-query2(x-1)%mod+mod)%mod;
}
void change(int i,int k){//单点赋值
    int t=i,p=k;
    k-=inq1(i,i);
    while (t<=n){
        tr1[t]+=(k%mod+mod)%mod;
        tr2[t]+=(p*p%mod+mod)%mod-(inq2(i,i)%mod+mod)%mod;
        t+=lowbit(t);
    }
    return;
}
signed main(){
    cin>>n>>m;
    for (int i=1;i<=n;i++){
        cin>>b[i];
        change(i,b[i]);
    }
    while (m--){
        cin>>c>>x>>y;
        if (c==1){
            change(x,y);
        }else{
            int sum1=(inq1(x,y)%mod+mod)%mod;
            int sum2=(inq2(x,y)%mod+mod)%mod;
            int len=y-x+1;
            int a=sum2*len%mod-sum1*sum1%mod;
            int b=len*len%mod;
            int ans=(a*qpow(b,mod-2)%mod+mod)%mod;
            cout<<(ans%mod+mod)%mod<<'\n';
        }
    }
    return 0;
}
2025/7/20 08:35
加载中...