线段树30pts求调
查看原帖
线段树30pts求调
1076971
anke2017楼主2024/9/14 13:46

RT.

#include<iostream>
#include<cmath>

using namespace std;

const int mod=1e9+7;
const int maxn=1e5+10;

int qpow(int p,int times)
{
    int ans=1;
    while(times)
    {
        if(times&1)ans=((long long)ans*p%mod);
        p=((long long)p*p%mod);
        times>>=1;
    }
    return ans;
}

struct seg
{
	long long num[4*maxn];
	long long num2[4*maxn];
	int the_st[maxn];
	inline int lson(int x){return x<<1;}
	inline int rson(int x){return (x<<1)|1;}
	void build(int now,int l,int r)
	{
		if(l==r)
		{
			num[now]=the_st[l]%mod;
			num2[now]=(long long)the_st[l]*the_st[l]%mod;
			return;
		}
		int mid=(l+r)>>1;
		build(lson(now),l,mid);
		build(rson(now),mid+1,r);
		num[now]=(num[lson(now)]+num[rson(now)])%mod;
		num2[now]=(num2[lson(now)]+num2[rson(now)])%mod;
	}
	void change(int now,int l,int r,int q,int change_num)
	{
		if(l==r)
		{
			num[now]=change_num%mod;
			num2[now]=(long long)(change_num*change_num%mod);
			return;
		}
		int mid=(l+r)>>1;
		if(mid<q)change(rson(now),mid+1,r,q,change_num);
		else change(lson(now),l,mid,q,change_num);
		num[now]=(num[lson(now)]+num[rson(now)])%mod;
		num2[now]=(num2[lson(now)]+num2[rson(now)])%mod;
	}
	long long query1(int now,int l,int r,int ql,int qr)
	{
		if(ql<=l&&r<=qr)
		{
			return num[now];
		}
		int mid=(l+r)>>1;
		long long ans=0;
		if(ql<=mid)ans=query1(lson(now),l,mid,ql,qr);
		if(mid<qr)ans=(ans+query1(rson(now),mid+1,r,ql,qr))%mod;
		return ans;
	}
	long long query2(int now,int l,int r,int ql,int qr)
	{
		if(ql<=l&&r<=qr)
		{
			return num2[now];
		}
		int mid=(l+r)>>1;
		long long ans=0;
		if(ql<=mid)ans=query2(lson(now),l,mid,ql,qr);
		if(mid<qr)ans+=query2(rson(now),mid+1,r,ql,qr);
		return ans%mod;
	}
}seg;

int main()
{
	int n,q;
	cin>>n>>q;
	for(int i=1;i<=n;i++)
	{
		cin>>seg.the_st[i];
	}
	seg.build(1,1,n);
	for(int i=1,t1,t2,t3;i<=q;i++)
	{
		cin>>t1>>t2>>t3;
		if(t1==1)
		{
			seg.change(1,1,n,t2,t3);
		}
		else
		{
			long long part1=seg.query2(1,1,n,t2,t3)%mod;
			long long part2=(long long)qpow(seg.query1(1,1,n,t2,t3),2)%mod*qpow(t3-t2+1,mod-2)%mod;
			long long part4=(long long)(part1-part2+mod)%mod*qpow(t3-t2+1,mod-2)%mod;
			cout<<part4<<'\n';
		}
	}
}
2024/9/14 13:46
加载中...