@zhanweijie的线段是板子求调
  • 板块灌水区
  • 楼主Jerry_heng
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/19 07:20
  • 上次更新2024/3/19 07:21:04
查看原帖
@zhanweijie的线段是板子求调
763878
Jerry_heng楼主2024/3/19 07:20

P2023

我找不出来qwq

#include<bits/stdc++.h>
#define int long long
using namespace std;
int add[400005],sum[400005],a[100005],modi[4000005];
int n,p,m;
void pushdown(int now,int l,int r,int mid)
{
	if (add[now]==0&&modi[now]==1) return;
	if (modi[now]!=1)
	{
		modi[now*2]*=modi[now];
		modi[now*2+1]*=modi[now];
		sum[now*2]=sum[now*2]*modi[now]%p;
		sum[now*2+1]=sum[now*2+1]*modi[now]%p;
		add[now*2]=add[now*2]*modi[now]%p;
		add[now*2+1]=add[now*2+1]*modi[now]%p;
		modi[now]=1;
	}
	if (add[now]!=0)
	{
		add[now*2]=(add[now*2]+add[now])%p;
		add[now*2+1]=(add[now*2+1]+add[now])%p;
		sum[now*2]=(sum[now*2]+(mid-l+1)*add[now]%p)%p;
		sum[now*2+1]=(sum[now*2+1]+(r-mid)*add[now]%p)%p;
		add[now]=0;
	}
}
void change_1(int now,int l,int r,int x,int y,int c)
{
	if (l>y||r<x) return;
	if (l>=x&&r<=y)
	{
		modi[now]*=c;
		modi[now]%=p;
		add[now]*=c;
		add[now]%=p;
		sum[now]=sum[now]*c%p;
		return;
	}
	int mid=l+r>>1;
	pushdown(now,l,r,mid);
	change_1(now*2,l,mid,x,y,c);
	change_1(now*2+1,mid+1,r,x,y,c);
	sum[now]=(sum[now*2]+sum[now*2+1])%p;
}
void change_2(int now,int l,int r,int x,int y,int c)
{
	if (l>y||r<x) return;
	if (l>=x&&r<=y)
	{
		add[now]+=c;
		add[now]%=p; 
		sum[now]=(sum[now]+(r-l+1)*c)%p;
		return;
	}
	int mid=l+r>>1;
	pushdown(now,l,r,mid);
	change_2(now*2,l,mid,x,y,c);
	change_2(now*2+1,mid+1,r,x,y,c);
	sum[now]=(sum[now*2]+sum[now*2+1])%p;
}
void build(int now,int l,int r)
{
	modi[now]=1;
	if (l==r) 
	{
		sum[now]=a[l]%p;
		add[now]=0;
		return;
	}
	int mid=l+r>>1;
	build(now*2,l,mid);
	build(now*2+1,mid+1,r);
	sum[now]=(sum[now*2]+sum[now*2+1])%p;
}
int query(int now,int l,int r,int x,int y)
{
	if (l>y||r<x) return 0;
	if (l>=x&&r<=y) return sum[now]%p;
	int mid=l+r>>1;
	pushdown(now,l,r,mid);
	int ans=query(now*2,l,mid,x,y)+query(now*2+1,mid+1,r,x,y);
	return ans%p;
}
signed main()
{
	scanf("%lld%lld",&n,&p);
	for (int i=1;i<=n;i++)
	scanf("%lld",&a[i]);
	build(1,1,n);
	scanf("%lld",&m);
	for (int i=1;i<=m;i++)
	{
		int op;
		scanf("%lld",&op);
		if (op==1)
		{
			int t,g,c;
			scanf("%lld%lld%lld",&t,&g,&c);
			change_1(1,1,n,t,g,c);
		}
		else if (op==2)
		{
			int t,g,c;
			scanf("%lld%lld%lld",&t,&g,&c);
			change_2(1,1,n,t,g,c);
		}
		else 
		{
			int t,g;
			scanf("%lld%lld",&t,&g);
			if(p==1)puts("0");
			else printf("%lld\n",query(1,1,n,t,g)%p);
		}
	}
	return 0;
}
2024/3/19 07:20
加载中...