求助,建树都卡死了
查看原帖
求助,建树都卡死了
183990
隋乐珉楼主2020/11/30 23:36
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+100;
ll a[maxn];
ll p;
struct nod{
	int l,r;
	ll sum;
	ll tagc;
	ll tagj;
}t[maxn*4];
void push_down(int num)
{
	t[num*2].tagj=(t[num].tagj+t[num<<1].tagj*t[num].tagc%p)%p;
	t[num*2+1].tagj=(t[num].tagj+t[(num<<1)+1].tagj*t[num].tagc%p)%p;
	t[num*2].tagc=t[num*2].tagc*t[num].tagc%p;
	t[num*2+1].tagc=t[num*2+1].tagc*t[num].tagc%p;
	t[num<<1].sum=t[num<<1].sum+(t[num<<1].r-t[num<<1].l+1)%p*t[num].tagc%p+(t[num<<1].r-t[num<<1].l+1)%p*t[num].tagj%p;
	t[num<<1|1].sum=t[num<<1|1].sum+(t[num<<1|1].r-t[num<<1|1].l+1)%p*t[num].tagc%p+(t[num<<1|1].r-t[num<<1|1].l+1)%p*t[num].tagj%p;
	t[num].tagc=1;
	t[num].tagj=0;
}
void build(int num,int l,int r)
{

	t[num].l=l;
	t[num].r=r;
	if(l==r)
	{	

		t[num].sum=a[l]%p;
		t[num].tagc=1;
		t[num].tagj=0;
	
		return;
	}
	//cout<<"build_bug"<<" ";
	
	int mid=(l+r)>>1;
	cout<<num<<" "<<l<<" "<<" "<<r<<" "<<mid<<endl;

	build(num*2,l,mid);
	cout<<"ok";
	build(num*2+1,mid+1,r); 
	
	t[num].sum=t[num<<1].sum+t[num<<1|1].sum;
	t[num].sum%=p;
	return;

}
ll query(int num,int l,int r)
{
	if(t[num].l>=l && t[num].r<=r)
	{
		return t[num].sum%p;
	}
	push_down(num);
	int mid=l+r>>1;
	ll ans=0; 
	if( l<=mid ) 
	ans+=query(num*2,l,r),ans%=p; 
	if(r>mid)
	ans+=query(num<<1|1,l,r),ans%=p;
	
	return ans;
}
void modiefyc(int num,int l,int r,ll v)
{
	cout<<"bug";
	if(t[num].l>=l && t[num].r<=r)
	{
		t[num].tagc=t[num].tagc*v%p;
		t[num].tagj=(t[num].tagj*v)%p;
		t[num].sum=t[num].sum*v;
		t[num].sum%=p;
		return;
	}
	push_down(num);
	int mid=l+r>>1;
	if(l<=mid) modiefyc(num*2,l,r,v);
	if(r>mid) modiefyc(num*2+1,l,r,v);
	t[num].sum=t[num<<1].sum+t[num<<1|1].sum;
	t[num].sum%=p;
}
void modiefyj(int num,int l,int r,ll v)//+
{
	cout<<"modiefyjbug";
	if(t[num].l>=l && t[num].r<=r)
	{
		t[num].tagj=(t[num].tagj+v)%p;
		t[num].sum=(t[num].r-t[num].l+1)*v;
		return;
	}
		push_down(num);
	int mid=l+r>>1;
	if(l<=mid) modiefyj(num*2,l,r,v);
	if(r>mid) modiefyj(num*2+1,l,r,v);
	t[num].sum=t[num<<1].sum+t[num<<1|1].sum;
	t[num].sum%=p;
}
int main()
{
	int n,m,p;
	cin>>n>>m>>p;
	
	for(int i=1;i<=n;i++)
	scanf("%lld",a+i);
	
	build(1,1,n);

	for(int i=1;i<=m;i++)
	{
		\
		int opt;
		scanf("%d",&opt);
		if(opt==1)
		{
			int x,y;
			ll k;
			scanf("%d%d%lld",&x,&y,&k);
			modiefyc(1,x,y,k);
		}
		if(opt==2)
		{
			int x,y;
			ll k;
			scanf("%d%d%lld",&x,&y,&k);
			modiefyj(1,x,y,k);
		}
		if(opt==3)
		{
			int x,y;
			scanf("%d%d",&x,&y);
			printf("%lld\n",query(1,x,y)%p);
		}
	}
	
	
	
	
	
	
	
	
	return 0;
} 
2020/11/30 23:36
加载中...