30pts求助
查看原帖
30pts求助
725725
LinkingStar楼主2023/10/19 13:12
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,q,mod,b[N];
struct node{int l,r,laz,sum,mul;}a[4*N];
inline void pushdown(int root)
{
    a[root*2].sum=(a[root].mul*a[root*2].sum+((a[root*2].r-a[root*2].l+1)*a[root].laz)%mod)%mod;
    a[root*2+1].sum=(a[root].mul*a[root*2+1].sum+(a[root].laz*(a[root*2+1].r-a[root*2+1].l+1))%mod)%mod;	
    a[root*2].mul=(a[root*2].mul*a[root].mul)%mod;
    a[root*2+1].mul=(a[root*2+1].mul*a[root].mul)%mod;
	a[root*2].laz=(a[root*2].laz*a[root].mul+a[root].laz)%mod;
    a[root*2+1].laz=(a[root*2+1].laz*a[root].mul+a[root].laz)%mod;
    a[root].mul=1,a[root].laz=0;
}
inline void build(int root,int l,int r)
{
//	cout<<root<<' '<<l<<' '<<r<<' '<<b[l]<<endl;
	a[root].l=l;a[root].r=r;a[root].mul=1;
	if(l==r){a[root].sum=b[l]%mod;return;}
	int mid=(l+r)/2;
	build(root*2,l,mid);build(root*2+1,mid+1,r);
	a[root].sum=(a[root*2].sum+a[root*2+1].sum)%mod;
}
inline int query(int root,int l,int r)
{
    if(l<=a[root].l&&a[root].r<=r)return a[root].sum;
    pushdown(root);
    int ans=0,mid=(a[root].l+a[root].r)/2;
    if(l<=mid)ans=(ans+query(root*2,l,r))%mod;
    if(r>mid)ans=(ans+query(root*2+1,l,r))%mod;
    return ans;
}
inline void add(int root,int l,int r,int num)
{
    if(a[root].l>=l&&a[root].r<=r)
    {
        a[root].laz=(a[root].laz+num)%mod;
        a[root].sum+=(a[root].r-a[root].l+1)*num;
        return;
    }
	a[root].sum=(a[root*2].sum+a[root*2+1].sum)%mod;
	pushdown(root);int mid=(a[root].l+a[root].r)/2;
	if(mid>=l)add(root*2,l,r,num);
	if(mid<r)add(root*2+1,l,r,num);
	a[root].sum=(a[root*2].sum+a[root*2+1].sum)%mod;	
}
inline void multi(int root,int l,int r,int num)
{
//	cout<<root<<' '<<l<<' '<<r<<' '<<num<<endl;
	if(a[root].l>=l&&a[root].r<=r)
	{
		a[root].laz=(a[root].laz*num)%mod;
		a[root].mul=(a[root].mul*num)%mod;
		a[root].sum=(a[root].sum*num)%mod;
		return;
	}
	pushdown(root);
	a[root].sum=(a[root*2].sum*a[root*2+1].sum)%mod;
	int mid=(a[root].l+a[root].r)/2;
	if(mid>=l)multi(root*2,l,r,num);
	if(mid<r)multi(root*2+1,l,r,num);
	a[root].sum=(a[root*2].sum*a[root*2+1].sum)%mod;	
}
signed main()
{
	scanf("%lld%lld%lld",&n,&q,&mod);
	for(int i=1;i<=n;++i)scanf("%lld",&b[i]);
	build(1,1,n);
	while(q--)
	{
		int opt,l,r,k;scanf("%lld",&opt);
		if(opt==2)
		{
			scanf("%lld%lld%lld",&l,&r,&k);
			add(1,l,r,k);
		}
		else if(opt==1)
		{
			scanf("%lld%lld%lld",&l,&r,&k);
			multi(1,l,r,k);
		}
		else scanf("%lld%lld",&l,&r),printf("%lld\n",query(1,l,r)%mod);
//    for(int i=1;i<=n;++i)cout<<query(1,i,i)<<' ';putchar(10);
    }
	return 0;
}
2023/10/19 13:12
加载中...