求助
查看原帖
求助
285617
黑影洞人楼主2021/10/30 14:04

#include<cstdio>
#include<algorithm>
#define mod 1000000007
#define N 100005
#define int long long
#define lc p>>1
#define rc p>>1|1
#define mm (l+r)/2
using namespace std;
int ginv(int a,int p=mod-2){
	a%mod;int s=1;
	for(;p;p>>=1,a=a*a%mod)if(p&1)s=s*a%mod;
	return s;
}
struct segementtree{
	int l,r;
	int su,pf;
}s[N]; 
int n,m;
void pushup(int p){
	s[p].su=(s[lc].su+s[rc].su)%mod;
	s[p].pf=(s[lc].pf+s[rc].pf)%mod;
}
void build(int p,int l,int r){
	s[p].l=l,s[p].r=r;
	if(l==r){
		int a;
		scanf("%d",&a);
		s[p].su+=a;
		s[p].pf+=a*a%mod;
	}
	build(lc,l,mm);
	build(rc,mm+1,r);
	pushup(p);
}
void add(int p,int u,int v){
	if(s[p].l>u||s[p].r<u)return;
	if(s[p].l==s[p].r&&s[p].r==u){
		s[p].su=v%mod;
		s[p].pf=v*v%mod;
		return;
	}
	add(lc,u,v);add(rc,u,v);
	pushup(p);
}
int querys(int p,int l,int r){
	if(s[p].l>r||s[p].r<l)return 0;
	if(s[p].l>=l&&s[p].r<=r)return s[p].su;
	return (querys(lc,l,r)+querys(rc,l,r))%mod; 
}
int queryp(int p,int l,int r){
	if(s[p].l>r||s[p].r<l)return 0;
	if(s[p].l>=l&&s[p].r<=r)return s[p].pf;
	return (queryp(lc,l,r)+queryp(rc,l,r))%mod; 
}
signed main(){
	scanf("%d%d",&n,&m);
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int c,l,r;
		scanf("%d%d%d",&c,&l,&r);
		if(c==1)add(1,l,r);
		else {
			int a=querys(1,l,r),b=queryp(1,l,r);
			int inv=ginv(r-l+1);int aiv=a*inv%mod;
			int biv=b*inv%mod-aiv*aiv%mod;
			biv=(biv%mod+mod)%mod;printf("%d\n",biv);
		}
	}
	return 0;
}



2021/10/30 14:04
加载中...