树状数组30pts,AC on #1,#5,#10,悬关求调
查看原帖
树状数组30pts,AC on #1,#5,#10,悬关求调
1124940
glacier_001楼主2024/9/15 21:55
#include<iostream>
#define ll long long
#define N 100005
using namespace std;
int n,m;
const ll p=1e9+7;
ll f[N],g[N],c[N];
ll lb(ll x){//lowbit
	return x&-x;
}
ll qp(ll a,ll b){//quick_pow
	if(b==0) return 1ll;
	ll x=qp(a*a%p,b/2)%p;
	return b%2?x*a%p:x%p;
}
void add(ll x,ll y,ll b[]){
	while(x<=n){
		b[x]=((b[x]+y)%p+p)%p;
		x+=lb(x);
	}
}
ll query(ll x,ll b[]){
	ll ans=0;
	while(x){
		ans=(ans+b[x])%p;
		x-=lb(x);
	}
	return ans;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>c[n];
		add(i,c[n]%p,f);
		add(i,c[n]*c[n]%p,g);
	}
	for(int i=1,ch;i<=m;i++){
		long long x,y;
		cin>>ch>>x>>y;
		if(ch==1){
			add(x,(y*y%p-c[x]*c[x]%p+p)%p,g);
			add(x,(y-c[x]+p)%p,f);
			c[x]=y;
		}else{
			ll s=(query(y,f)-query(x-1,f)+p)%p;//和 
			ll t=(query(y,g)-query(x-1,g)+p)%p;//平方和 
			ll q=y-x+1;
			ll fz=(q*t%p-s*s%p+p)%p;//分子 
			ll fm=q*q%p;//分母 
			cout<<fz*qp(fm,p-2)%p<<endl;
		}
	}
	return 0;
} 
2024/9/15 21:55
加载中...