树状数组30分求助
查看原帖
树状数组30分求助
760776
zzy_zzy楼主2023/7/19 16:44
#include<bits/stdc++.h>
#define int long long
#define lowbit(i) i&(-i)
using namespace std;
const int mod=1e9+7;
int quick_pow(int x,int k){
	x%=mod;
	int res=1;
	while(k){
		if(k&1){
			res=res*x%mod;
		}
		x=x*x%mod;
		k>>=1;
	}
	return res;
}
int inv(int x){
	return quick_pow(x,mod-2);
}
int a[100010],tree1[100010],tree2[100010],n,t;
void query(int x,int y){
	for(int i=x;i<=n;i+=lowbit(i)){
		tree1[i]=(((tree1[i]+y)%mod)+mod)%mod;
		tree2[i]=((tree2[i]+y*abs(y)%mod)+mod)%mod;
	}
}
int sum1(int x){
	int sum=0;
	for(int i=x;i;i-=lowbit(i)){
		sum=(sum+tree1[i])%mod;
	}
	return sum;
}
int sum2(int x){
	int sum=0;
	for(int i=x;i;i-=lowbit(i)){
		sum=(sum+tree2[i])%mod;
	}
	return sum;
}
int ask_sum1(int l,int r){
	return sum1(r)-sum1(l-1);
}
int ask_sum2(int l,int r){
	return sum2(r)-sum2(l-1);
}

signed main(){
	cin>>n>>t;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		query(i,a[i]);
	}
	while(t--){
		int opt,x,y;
		cin>>opt>>x>>y;
		if(opt==1){
			query(x,y);
		}
		else{
			int ans1=ask_sum1(x,y)%mod;
			int ans2=ask_sum2(x,y)%mod;
//			cout<<ans1<<" "<<ans2<<endl;
			int IAKIOI=inv(y-x+1)%mod;
			ans1=ans1%mod*IAKIOI%mod,ans2=ans2%mod*IAKIOI%mod;
			int ans=(ans2-ans1%mod*ans1%mod+mod)%mod;
			ans=((ans+mod*10)%mod+mod)%mod;
			cout<<ans<<endl;
		}
	}
	return 0;
}

RT.估计是取模的问题

2023/7/19 16:44
加载中...