不知道为啥0pts
查看原帖
不知道为啥0pts
491007
凤凰工作室楼主2023/11/25 17:09
#include<bits/stdc++.h>
using namespace std;
#define int long long

int arr[100005],n,q,m;

class stree
{
	public:
		int l,r,sum;
}tree[800005];

int lazya[800005],lazym[800005];

void pushup(int k)
{
	tree[k].sum=(tree[k<<1].sum+tree[k<<1|1].sum)%m;
}

void pushdown(int k)
{
	tree[k<<1].sum=((tree[k<<1].sum*lazym[k])%m+(lazya[k]*(tree[k<<1].r-tree[k<<1].l+1))%m)%m;
	tree[k<<1|1].sum=((tree[k<<1|1].sum*lazym[k])%m+(lazya[k]*(tree[k<<1|1].r-tree[k<<1|1].l+1))%m)%m;
	lazya[k<<1]=((lazya[k<<1]*lazym[k])%m+lazya[k])%m;
	lazya[k<<1|1]=((lazya[k<<1|1]*lazym[k])%m+lazya[k])%m;
	lazym[k<<1]=(lazym[k<<1]*lazym[k])%m;
	lazym[k<<1|1]=(lazym[k<<1|1]*lazym[k])%m;
	lazya[k]=0;
	lazym[k]=1;
}

void add(int L,int R,int k,int c)
{
	if(L<=tree[k].l&&tree[k].r<=R)
	{
		lazya[k]=(lazya[k]+c)%m;
		tree[k].sum=(tree[k].sum+c*(tree[k].r-tree[k].l+1)%m)%m;
		return;
	}
	pushdown(k);
	int mid=(tree[k].r+tree[k].l)>>1;
	if(L<=mid)add(L,R,k<<1,c);
	if(R>mid)add(L,R,k<<1|1,c);
	pushup(k);
}

void mul(int L,int R,int k,int c)
{
	if(L<=tree[k].l&&tree[k].r<=R)
	{
		lazym[k]=(lazym[k]*c)%m;
		lazya[k]=(lazya[k]*c)%m;
		tree[k].sum=(tree[k].sum*c)%m;
		return;
	}
	pushdown(k);
	int mid=(tree[k].r+tree[k].l)>>1;
	if(L<=mid)mul(L,R,k<<1,c);
	if(R>mid)mul(L,R,k<<1|1,c);
	pushup(k);
}

void build(int L,int R,int k)
{
	lazym[k]=1;
	tree[k].r=R;tree[k].l=L;
	if(R==L)
	{
		tree[k].sum=arr[R]%m;
		return;
	}
	int mid=(tree[k].r+tree[k].l)>>1;
	build(L,mid,k<<1);
	build(mid+1,R,k<<1|1);
	pushup(k);
}

int qurey(int L,int R,int k)
{
	if(L<=tree[k].l&&tree[k].r<=R)
	{
		return tree[k].sum;
	}
	pushdown(k);
	int mid=(tree[k].r+tree[k].l)>>1;
	int sum=0;
	if(L<=mid)sum=(sum+qurey(L,mid,k<<1))%m;
	if(R>mid)sum=(sum+qurey(mid+1,R,k<<1|1))%m;
	return sum;
}

signed main(void)
{
	cin>>n>>q>>m;
	for(int i=1;i<=n;i++)
		cin>>arr[i];
	build(1,n,1);
	while(q--)
	{
		int op;
		cin>>op;
		if(op==1)
		{
			int x,y,k;
			cin>>x>>y>>k;
			mul(x,y,1,k);
		}
		if(op==2)
		{
			int x,y,k;
			cin>>x>>y>>k;
			add(x,y,1,k);
		}
		if(op==3)
		{
			int x,y;
			cin>>x>>y;
			cout<<qurey(x,y,1)<<endl;
		}
	}
	return 0;
}
2023/11/25 17:09
加载中...