求调
  • 板块P5142 区间方差
  • 楼主dyxcj
  • 当前回复1
  • 已保存回复1
  • 发布时间2025/7/28 11:19
  • 上次更新2025/7/28 15:12:19
查看原帖
求调
1423724
dyxcj楼主2025/7/28 11:19
#include<bits/stdc++.h>
using namespace std;
const int mod=1000000007;
long long w[400005],p[400005],a[100005];
int n,m;
void pushup(int u){
	w[u]=w[u*2]+w[u*2+1];
	p[u]=p[u*2]+p[u*2+1];
}
bool InRange(int L,int R,int l,int r){
	return (l<=L)&&(r>=R);
}
bool OutRange(int L,int R,int l,int r){
	return (l>R)||(r<L);
}
void build(int u,int L,int R){
	if(L==R){
		w[u]=a[L];
		p[u]=a[L]*w[u];
		return;
	}
	int mid=(L+R)/2;
	build(u*2,L,mid);
	build(u*2+1,mid+1,R);
	pushup(u);
}
long long query(int u,int L,int R,int l,int r){
	if(InRange(L,R,l,r)) return w[u];
	else if(!OutRange(L,R,l,r)){
		int mid=(L+R)/2;
		return query(u*2,L,mid,l,r)+query(u*2+1,mid+1,R,l,r);
	}else return 0;
}
long long query1(int u,int L,int R,int l,int r){
	if(InRange(L,R,l,r)) return p[u];
	else if(!OutRange(L,R,l,r)){
		int mid=(L+R)/2;
		return query1(u*2,L,mid,l,r)+query1(u*2+1,mid+1,R,l,r);
	}else return 0;
}
void update(int u,int L,int R,int l,long long x){
	if(l==L&&L==R){
		w[u]=x;
		p[u]=x*x;
		return;
	}
	int mid=(L+R)/2;
	if(l<=mid)update(u*2,L,mid,l,x);
	else update(u*2+1,mid+1,R,l,x);
	pushup(u);
}
long long fastpow(int a,int b=mod-2,int m=mod){
	a%=m;
	long long res=1;
	while(b){
		if(b&1)res=res*a%m;
		a=a*a%m;
		b>>=1;
	}
	return res;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	for(int i=1,a,b;i<=m;i++){
		long long c;
		cin>>a>>b>>c;
		if(a==1)update(1,1,n,b,c%mod);
		else{
			long long d=query1(1,1,n,b,c)%mod,e=query(1,1,n,b,c)%mod,f=fastpow(c-b+1,mod-2,mod);
			long long g=d*f%mod;
			long long h=(d*f%mod-g*g%mod);
			h=(h%mod+mod)%mod;
			cout<<h<<"\n";
		}
	}
}
2025/7/28 11:19
加载中...