30分跪求dalao调试
查看原帖
30分跪求dalao调试
179343
LINdx楼主2022/11/25 21:34
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+100;
struct node
{
	long long sum;
	int lt,rt;
}tree[maxn*4];
int add[maxn*4],mu[maxn*4];
int A[maxn];
long long ans=0;
int p;
void build(int now,int l,int r)
{
	tree[now].lt=l;tree[now].rt=r;
	if(l==r)
	{
		tree[now].sum=A[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(now*2,l,mid);
	build(now*2+1,mid+1,r);
	tree[now].sum=(tree[now*2].sum+tree[now*2+1].sum)%p;
}
void Add(int now,int val)
{
	add[now]=(add[now]+val)%p;
	tree[now].sum=((tree[now].sum+(tree[now].rt-tree[now].lt+1)*val))%p;
}
void Mu(int now,int val)
{
	mu[now]=(mu[now]*val)%p;
	tree[now].sum=(tree[now].sum*val)%p;
}
void pushdownAdd(int now)
{
	Add(now*2,add[now]);
	Add(now*2+1,add[now]);
	add[now]=0;
}
void pushdownMu(int now)
{
	Mu(now*2,mu[now]);
	Mu(now*2+1,mu[now]);
	mu[now]=1;
}
void modifyAdd(int now,int l,int r,int x,int y,int val)
{
	if(x>=l&&y<=r)
	{
		pushdownAdd(now);
		pushdownMu(now);
		Add(now,val);
		return ;
	}
	pushdownAdd(now);
	pushdownMu(now);
	int mid=(x+y)>>1;
	if(mid>=l)modifyAdd(now*2,l,r,x,mid,val);
	if(r>mid)modifyAdd(now*2+1,l,r,mid+1,y,val);
	tree[now].sum=(tree[now*2].sum+tree[now*2+1].sum)%p;
}
void modifyMu(int now,int l,int r,int x,int y,int val)
{
	if(x>=l&&y<=r)
	{
		pushdownAdd(now);
		pushdownMu(now);
		Mu(now,val);
		return ;
	}
	pushdownAdd(now);
	pushdownMu(now);
	int mid=(x+y)>>1;
	if(mid>=l)modifyMu(now*2,l,r,x,mid,val);
	if(r>mid)modifyMu(now*2+1,l,r,mid+1,y,val);
	tree[now].sum=(tree[now*2].sum+tree[now*2+1].sum)%p;
}
void query(int now,int l,int r,int x,int y)
{
	if(x>=l&&y<=r)
	{
		ans=(ans+tree[now].sum)%p;
		return ;	
	} 
	pushdownAdd(now);
	pushdownMu(now);
	int mid=(x+y)>>1;
	if(mid>=l)query(now*2,l,r,x,mid);
	if(r>mid)query(now*2+1,l,r,mid+1,y);
}
void Pr()
{
	ans=0;
	query(1,1,4,1,5);
	cout<<ans<<endl;
	puts(" ");
	puts(" ");
}
int main()
{
	int n,m;
	cin>>n>>m>>p;
	for(int i=1;i<=n;i++)cin>>A[i];
	for(int i=1;i<=n;i++)mu[i]=1;
	build(1,1,n);
	while(m--)
	{
		int x,y,z;
		cin>>x;
		if(x==1)
		{
			cin>>x>>y>>z;
			modifyMu(1,x,y,1,n,z);
		}
		else if(x==2)
		{
			cin>>x>>y>>z;
			modifyAdd(1,x,y,1,n,z);
		}
		else
		{
			cin>>x>>y;
			ans=0;
			query(1,x,y,1,n);
			cout<<ans<<endl;
		}
	//	Pr();
	}
	return 0;
} 
2022/11/25 21:34
加载中...