求助不开long long会WA,开会MLE
查看原帖
求助不开long long会WA,开会MLE
312376
这是蜡笔大新楼主2022/11/16 21:04
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e5+10;
struct tree
{
	int l,r;
	long long v,c2=1,c;
}t[4*MAX];
int v[MAX],n,m,p;
void upd(int x,long long c,long long c2)
{
	t[x].v=((t[x].v*c2)%p+((t[x].r-t[x].l+1)*c)%p)%p;
	t[x].c*=c2;
	t[x].c%=p;
	t[x].c+=c;
	t[x].c%=p;
	t[x].c2*=c2;
	t[x].c2%=p;
}
void build(int x,int l,int r)
{
	int mid=(l+r)>>1;
	if(l==r) 
	{
		t[x].l=t[x].r=l;
		t[x].v=v[l];
		return;
	}
	build(x<<1,l,mid);
	build((x<<1)+1,mid+1,r);
	t[x].l=l;
	t[x].r=r;
	t[x].v=(t[x<<1].v+t[(x<<1)+1].v)%p;
}
void add(int x,int l,int r,long long c)
{
	if(t[x].l>=l && t[x].r<=r)
	{
		t[x].v+=c*(t[x].r-t[x].l+1);
		t[x].c+=c;
		return;
	}
	if(t[x].l!=t[x].r)
	if(t[x].c!=0 || t[x].c2!=1) 
	{
		upd(x<<1,t[x].c,t[x].c2);
		upd((x<<1)+1,t[x].c,t[x].c2);
		t[x].c=0;
		t[x].c2=1;
	}
	int mid=(t[x].l+t[x].r)>>1;
	if(mid==0) return;
	if(mid>=l) add(x<<1,l,r,c);
	if(mid<r) add((x<<1)+1,l,r,c);
	t[x].v=(t[x<<1].v+t[(x<<1)+1].v)%p;
}
void cheng(int x,int l,int r,long long c)
{
	if(t[x].l>=l && t[x].r<=r)
	{
		t[x].c*=c;
		t[x].c%=p;
		t[x].v*=c;
		t[x].v%=p;
		t[x].c2*=c;
		t[x].c2%=p;
		return;
	}
	if(t[x].l!=t[x].r)
	if(t[x].c!=0 || t[x].c2!=1) 
	{
		upd(x<<1,t[x].c,t[x].c2);
		upd((x<<1)+1,t[x].c,t[x].c2);
		t[x].c=0;
		t[x].c2=1;
	}
	int mid=(t[x].l+t[x].r)>>1;
	if(mid==0) return;
	if(mid>=l) cheng(x<<1,l,r,c);
	if(mid<r) cheng((x<<1)+1,l,r,c);
	t[x].v=(t[x<<1].v+t[(x<<1)+1].v)%p;
}
long long getsum(int x,int l,int r)
{
	if(t[x].l==0) return 0;
	if(t[x].l!=t[x].r)
	if(t[x].c!=0 || t[x].c2!=1) 
	{
		upd(x<<1,t[x].c,t[x].c2);
		upd((x<<1)+1,t[x].c,t[x].c2);
		t[x].c=0;
		t[x].c2=1;
	}
	long long ans=0;
	if(t[x].l>=l && t[x].r<=r)
	{ 
		ans=t[x].v;
		return ans%p;
	}
	int mid=(t[x].l+t[x].r)>>1;
	
	if(mid>=l) ans+=getsum(x<<1,l,r);
	ans%=p;
	if(mid<r) ans+=getsum((x<<1)+1,l,r);
	ans%=p;
	return ans;
}
signed main()
{
	scanf("%d%d%d",&n,&m,&p);
	for(int i=1;i<=n;i++) 
	{
		long long kk;
		scanf("%lld",&kk);
		v[i]=kk%p;
	}
	build(1,1,n);//check(1);
	for(int i=1;i<=m;i++)
	{
		int tp;
		scanf("%d",&tp);
		if(tp==1)
		{
			int l,r;
			long long k;
			scanf("%d%d%lld",&l,&r,&k);
			cheng(1,l,r,k%p);
		}
		if(tp==2)
		{
			int l,r;
			long long k;
			scanf("%d%d%lld",&l,&r,&k);
			add(1,l,r,k);
		}
		if(tp==3)
		{
			int l,r;
			scanf("%d%d",&l,&r);
			printf("%lld\n",getsum(1,l,r));
		}
	}
	
	return 0;
}

2022/11/16 21:04
加载中...