线段树30分
查看原帖
线段树30分
993306
ruanshaochuan______楼主2023/10/4 22:34
#include<bits/stdc++.h>
#define ls(p) p<<1
#define rs(p) p<<1|1
#define int long long
using namespace std;
const int N=1e5+5;
int n,m,tree[N*4],adddtag[N*4],a[N],mulltag[N*4],mod;
void push_up(int p)
{
	tree[p]=(tree[ls(p)]%mod+tree[rs(p)]%mod)%mod;
}
void build(int p,int pl,int pr)
{
	mulltag[p]=1;
	if(pl==pr)
	{
		tree[p]=a[pl];
		tree[p]%=mod;
		return;
	}
	int mid=(pl+pr)>>1;
	build(ls(p),pl,mid);
	build(rs(p),mid+1,pr);
	push_up(p);
}

void addtag(int p,int pl,int pr,int d)
{
	adddtag[p]+=d;
	adddtag[p]%=mod;
	tree[p]+=d*(pr-pl+1);
	tree[p]%=mod;
}
void multag(int p,int pl,int pr,int d)
{
	adddtag[p]*=d;
	adddtag[p]%=mod;
	mulltag[p]*=d;
	mulltag[p]%=mod;
	tree[p]*=d;
	tree[p]%=mod;
}
void push_down(int p,int pl,int pr)
{
	if(mulltag[p])
	{
		int mid=(pl+pr)>>1;
		multag(ls(p),pl,mid,mulltag[p]);
		multag(rs(p),mid+1,pr,mulltag[p]);
		mulltag[p]=1;
	}
	if(adddtag[p])
	{
		int mid=(pl+pr)>>1;
			addtag(ls(p),pl,mid,adddtag[p]);
		addtag(rs(p),mid+1,pr,adddtag[p]);
		adddtag[p]=0;
	}
}
void upadddata(int l,int r,int p,int pl,int pr,int d)
{
	if(l<=pl&&pr<=r)
	{
		addtag(p,pl,pr,d);
		return;
	}
	push_down(p,pl,pr);
	int mid=(pl+pr)>>1;
	if(l<=mid) upadddata(l,r,ls(p),pl,mid,d);
	if(r>mid) upadddata(l,r,rs(p),mid+1,pr,d);
	push_up(p);
}
void upmuldata(int l,int r,int p,int pl,int pr,int d)
{
	if(l<=pl&&pr<=r)
	{
		multag(p,pl,pr,d);
		return;
	}
	push_down(p,pl,pr);
	int mid=(pl+pr)>>1;
	if(l<=mid) upmuldata(l,r,ls(p),pl,mid,d);
	if(r>mid) upmuldata(l,r,rs(p),mid+1,pr,d);
	push_up(p);
}
int query(int l,int r,int p,int pl,int pr)
{
	if(l<=pl&&pr<=r)
	{
		return tree[p];
	}
	push_down(p,pl,pr);
	int mid=(pl+pr)>>1;
	int sum=0;
	if(l<=mid) sum+=query(l,r,ls(p),pl,mid);
	if(r>mid) sum+=query(l,r,rs(p),mid+1,pr);
	return sum;
}
signed main()
{
	cin>>n>>m>>mod;
	for(int i=1;i<=n;i++)
	{
	
		cin>>a[i];
		a[i]%=mod;
	}
	build(1,1,n);
	while(m--)
	{
		int op,l,r,d;
		cin>>op;
		if(op==1)
		{
			cin>>l>>r>>d;
			upmuldata(l,r,1,1,n,d);
		}
		if(op==2)
		{
			cin>>l>>r>>d;
			upadddata(l,r,1,1,n,d);
		}
		if(op==3)
		{
			cin>>l>>r;
			cout<<query(l,r,1,1,n)%mod<<endl;
		}
	}
}
2023/10/4 22:34
加载中...