P3373 求调!!全WA
  • 板块学术版
  • 楼主husy
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/8/4 19:56
  • 上次更新2023/10/27 17:00:23
查看原帖
P3373 求调!!全WA
484780
husy楼主2022/8/4 19:56

P3373

#include<iostream> 
using namespace std;
long long n,q,rt,tot,mod;
const long long maxn=1e5+10;
struct node
{
	long long lson,rson;
	long long add,mul;
	long long sum;
}t[4*maxn];
long long a[100010];
void push_up(long long p)
{
	t[p].sum=t[t[p].lson].sum%mod+t[t[p].rson].sum%mod;
	t[p].sum%=mod;
}
void push_tag(long long &p,long long l,long long r,long long d,long long k)
{
	if(!p)p=++tot; 
	if(k==2)
	{
		t[p].add=(t[p].add+d)%mod;
			t[p].sum=((t[p].sum)%mod+((r-l+1)*d)%mod)%mod;
	}
	else if(k==1)
	{
		t[p].mul=(t[p].mul*d)%mod;
		t[p].add=(t[p].add*d)%mod;
		t[p].sum=(t[p].sum*d)%mod;
	}
}
void push_down(long long p,long long l,long long r)
{
	if(t[p].mul!=1||t[p].add!=0)
	{long long mid=(l+r)>>1;
	    t[t[p].lson].sum=((t[t[p].lson].sum*t[p].mul)%mod+((mid-l+1)*t[p].add)%mod)%mod;
		t[t[p].rson].sum=((t[t[p].rson].sum*t[p].mul)%mod+((r-(mid+1)+1)*t[p].add)%mod)%mod;
		t[t[p].lson].mul=(t[t[p].lson].mul*t[p].mul)%mod;
		t[t[p].rson].mul=(t[t[p].rson].mul*t[p].mul)%mod;
		t[t[p].lson].add=((t[t[p].lson].add*t[p].mul)%mod+t[p].add%p)%mod;
		t[t[p].rson].add=((t[t[p].rson].add*t[p].mul)%mod+t[p].add%p)%mod;
		t[p].add=0,t[p].mul=1;
		
	}
	
}
void build(long long &p,long long l,long long r)
{
	if(!p)p=++tot;
	t[p].add=0,t[p].mul=1;
	if(l==r)
	{
		t[p].sum=a[l]%mod;
		return ;
	}
	long long mid=(l+r)>>1;
	build(t[p].lson,l,mid);
	build(t[p].rson,mid+1,r);
	push_up(p);
}
void change(long long &p,long long l,long long r,long long L,long long R,long long d)
{
	if(!p)p=++tot;
	if(L<=l&&r<=R)
	{
		push_tag(p,l,r,d,2);
		return ;
	}
	push_down(p,l,r);
	long long mid=(l+r)>>1;
	if(L<=mid)change(t[p].lson,l,mid,L,R,d); 
	if(R>mid)change(t[p].rson,mid+1,r,L,R,d); 
	push_up(p);
}
void change_mul(long long &p,long long l,long long r,long long L,long long R,long long d)
{
	if(!p)p=++tot;
	if(L<=l&&r<=R)
	{
		push_tag(p,l,r,d,1);
		return ;
	}
	push_down(p,l,r);
	long long mid=(l+r)>>1;
	if(L<=mid)change_mul(t[p].lson,l,mid,L,R,d); 
	if(R>mid)change_mul(t[p].rson,mid+1,r,L,R,d); 
	push_up(p);
}
long long ask(long long p,long long l,long long r,long long L,long long R)
{
	if(L<=l&&r<=R)
	{
		return t[p].sum;
	}
	push_down(p,l,r);
	long long mid=(l+r)>>1;
	long long res=0;
	if(L<=mid)res+=ask(t[p].lson,l,mid,L,R)%mod;
	if(R>mid)res+=ask(t[p].rson,mid+1,r,L,R)%mod;
	return res%mod;
}
int main()
{
	std::ios::sync_with_stdio(false);
	cin>>n>>q>>mod;
	for(long long i=1;i<=n;i++) cin>>a[i];
	build(rt,1,n);
	while(q--)
	{
		long long ch;
		cin>>ch;
		if(ch==1)
		{
			long long l,r,d;
			cin>>l>>r>>d;
			change_mul(rt,1,n,l,r,d);
		}
		else if(ch==2)
		{
			long long l,r,d;
			cin>>l>>r>>d;
			change(rt,1,n,l,r,d);
		}
		else
		{
			long long l,r;
			cin>>l>>r;
			cout<<ask(rt,1,n,l,r)<<endl;
		}
	}
	return 0;
}
2022/8/4 19:56
加载中...