萌新刚学OI,调哭了
查看原帖
萌新刚学OI,调哭了
149301
FCB_Yiyang2006✈楼主2020/6/20 18:10
#include<bits/stdc++.h>
using namespace std;
#define N 100005
int n,m,p;
int a[N];
int add[N*4],mul[N*4];
long long sum[N*4]; 
void build(int k,int l,int r)
{
	if(l==r)
	{
		sum[k]=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
	sum[k]=sum[k*2]+sum[k*2+1];
}
void Mul(int k,int l,int r,int v)
{	
	mul[k]=(mul[k]*v%p);
	add[k]=(add[k]*v%p);
	sum[k]=(sum[k]*v%p);
}
void Add(int k,int l,int r,int v)
{
	add[k]+=v;
	sum[k]+=(long long)v*(r-l+1);
}
void pushdown(int k,int l,int r,int mid)
{
	if(add[k]==0&&mul[k]==1)
	{
		return;
	}
	Mul(k*2,l,mid,mul[k]);
	Mul(k*2+1,mid+1,r,mul[k]);
	mul[k]=1;
	Add(k*2,l,mid,add[k]);
	Add(k*2+1,mid+1,r,add[k]);
	add[k]=0;
}
long long query(int k,int l,int r,int x,int y)
{
	if(y<l||x>r)
	{
		return 0;
	}
	if(l>=x&&r<=y)
	{
		return sum[k];
	}
	int mid=(l+r)/2;
	long long res=0;
	pushdown(k,l,r,mid);
	return query(k*2+1,mid+1,r,x,y)%p+query(k*2,l,mid,x,y)%p;
}
void modify(int k,int l,int r,int x,int y,int v,int opt)
{
	if(l>y||r<x)
	{
		return;
	}
	if(l>=x&&r<=y)
	{
		if(opt==2)
		{
			return Add(k,l,r,v);
		}
		else
		{
			return Mul(k,l,r,v);
		}
	}	
	int mid=(l+r)/2;
	pushdown(k,l,r,mid);
	if(x<=mid)
	{
		modify(k*2,l,mid,x,y,v,opt);
	}
	if(mid<y)
	{
		modify(k*2+1,mid+1,r,x,y,v,opt);
	}
	sum[k]=sum[k*2]+sum[k*2+1];
}
int main()
{
	cin>>n>>m>>p;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		int opt,k,l,r;
		scanf("%d%d%d",&opt,&l,&r);
		if(opt==1)
		{
			scanf("%d",&k);
			modify(1,1,n,l,r,k,opt);
		}
		else if(opt==2)
		{
			scanf("%d",&k);
			modify(1,1,n,l,r,k,opt);
		}
		else
		{
			printf("%lld\n",query(1,1,n,l,r)%p);
		}
	}
	return 0;
}

没过样例qwq

2020/6/20 18:10
加载中...