线段树过不去,萌新求调!!!
查看原帖
线段树过不去,萌新求调!!!
698678
zlinda楼主2022/8/2 22:15
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+7;
int n,m,p,a[N];
struct hhh
{
	int ans,l,r,mid,lz1,lz2;
} v[4*N];
void pushup(int x)
{
	v[x].ans=v[2*x].ans+v[2*x+1].ans;
	v[x].ans%=p;
}
void build(int x,int s,int t)
{
	v[x].l=s; v[x].r=t; v[x].mid=s+t>>1;
	if(s==t)
	{
		v[x].l=s; v[x].r=s;
		v[x].ans=a[s];
		return ;
	}
	build(2*x,s,v[x].mid);
	build(2*x+1,v[x].mid+1,t);
	pushup(x);
}
void pushdown(int x)
{
	if(v[x].lz1)
	{
		v[2*x].lz1+=v[x].lz1;v[2*x+1].lz1+=v[x].lz1;
		v[2*x].ans+=v[2*x].lz1*(v[2*x].r-v[2*x].l+1); v[2*x].ans%=p;
		v[2*x+1].ans+=v[2*x+1].lz1*(v[2*x+1].r-v[2*x+1].l+1); v[2*x+1].ans%=p;
		v[x].lz1=0;
	}
	if(v[x].lz2!=1)
	{
		v[2*x].lz2*=v[x].lz2; v[2*x].lz2*=v[x].lz2;
		v[2*x].ans*=v[x].lz2; v[2*x].ans%=p;
		v[2*x+1].ans*=v[x].lz2;v[2*x+1].ans%=p;
		v[x].lz2=1;
	}
}
void add(int x,int s,int t,int k)
{
	if(v[x].l>=s&&v[x].r<=t)
	{
		v[x].lz1+=k;
		v[x].ans+=v[x].lz1*(v[x].r-v[x].l+1);
		v[x].ans%=p;
		return ;
	}
	pushdown(x);
	if(v[x].mid>=s) add(2*x,s,t,k);
	if(v[x].mid<t) add(2*x+1,s,t,k);
	pushup(x);
}
void cheng(int x,int s,int t,int k)
{
	if(v[x].l>=s&&v[x].r<=t)
	{
		v[x].lz2*=k;
		v[x].ans*=k;
		v[x].ans%=p;
		return ;
	}
	pushdown(x);
	if(v[x].mid>=s) cheng(2*x,s,t,k);
	if(v[x].mid<t) cheng(2*x+1,s,t,k);
	pushup(x);
}
int q(int x,int s,int t)
{
	if(v[x].l>=s&&v[x].r<=t)
	{
		return v[x].ans;
	}
  	pushdown(x);
  	int sum=0;
  	if(v[x].mid>=s) sum+=q(2*x,s,t);
  	if(v[x].mid<t) sum+=q(2*x+1,s,t);
  	sum%=p;
	return sum;
}
int main()
{
	int i,j,op,x,y,k;
	cin>>n>>m>>p;
	for(i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	for(i=1;i<=4*n;i++) v[i].lz2=1;
	for(i=1;i<=m;i++)
	{
		cin>>op;
		if(op==1)
		{
			cin>>x>>y>>k;
			cheng(1,x,y,k);
			for(j=1;j<=n;j++)
			{
				cout<<q(1,j,j)<<" ";
			}
			cout<<'\n';
		}
		if(op==2)
		{
			cin>>x>>y>>k;
			add(1,x,y,k);
			for(j=1;j<=n;j++)
			{
				cout<<q(1,j,j)<<" ";
			}
			cout<<'\n';
		}
		if(op==3)
		{
			cin>>x>>y;
			//cout<<q(1,x,y)<<'\n';
			for(j=1;j<=n;j++)
			{
				cout<<q(1,j,j)<<" ";
			}
			cout<<'\n';
		}
	}
	return 0;
}
2022/8/2 22:15
加载中...