WA求助
查看原帖
WA求助
1041369
Gua_gua_楼主2023/9/24 14:57
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,q; 
int a[4000005],ans[4000005];
int cover_tag[4000005],add_tag[4000005];
int ls(int x){return x<<1;}
int rs(int x){return x<<1|1;}
void push_up(int x)
{
	ans[x]=max(ans[ls(x)],ans[rs(x)]);
}
void cover_push_down(int p)
{
	if(cover_tag[p]!=-1145141919180)
	{
		add_tag[ls(p)]=add_tag[rs(p)]=0;
		ans[ls(p)]=ans[rs(p)]=cover_tag[p];
		cover_tag[ls(p)]=cover_tag[rs(p)]=cover_tag[p];
		cover_tag[p]=-1145141919180;
	}
}
void add_push_down(int p)
{
	if(add_tag[p])
	{
		cover_push_down(p);
		ans[ls(p)]+=add_tag[p],ans[rs(p)]+=add_tag[p];
		add_tag[ls(p)]+=add_tag[p],add_tag[rs(p)]+=add_tag[p];
		add_tag[p]=0;
	}
}
void build(int p,int l,int r)
{
	if(l==r)
	{
		ans[p]=a[l];
		cover_tag[p]=-1145141919180;
		return;
	}
	int mid=(l+r)>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	push_up(p);
}
void cover_update(int l,int r,int pl,int pr,int p,int x)
{
	if(l<=pl&&pr<=r)
	{
		ans[p]=x;
		cover_tag[p]=x;
		add_tag[p]=0;
		return;
	} 
	cover_push_down(p);
	add_push_down(p);
	int mid=(pl+pr)>>1;
	if(l<=mid)cover_update(l,r,pl,mid,ls(p),x);
	if(r>mid)cover_update(l,r,mid+1,pr,rs(p),x);
	push_up(p);
}
void add_update(int l,int r,int pl,int pr,int p,int x)
{
	if(l<=pl&&pr<=r)
	{
		cover_push_down(p);
		ans[p]+=x;
		add_tag[p]+=x;
		return;
	} 
	cover_push_down(p);
	add_push_down(p);
	int mid=(pl+pr)>>1;
	if(l<=mid)add_update(l,r,pl,mid,ls(p),x);
	if(r>mid)add_update(l,r,mid+1,pr,rs(p),x);
	push_up(p);
}
int query(int l,int r,int pl,int pr,int p)
{
	if(l<=pl&&pr<=r)return ans[p];
	cover_push_down(p);
	add_push_down(p);
	int res=-1145141919810,mid=(pl+pr)>>1;
	if(l<=mid)res=max(res,query(l,r,pl,mid,ls(p)));
	if(r>mid)res=max(res,query(l,r,mid+1,pr,rs(p)));
	return res;
}
main()
{
	cin>>n>>q;
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	build(1,1,n);
	for(int i=1,op,l,r,x;i<=q;i++)
	{
		scanf("%lld",&op);
		if(op==1)
		{
			scanf("%lld%lld%lld",&l,&r,&x);
			cover_update(l,r,1,n,1,x);
		}
		else if(op==2)
		{
			scanf("%lld%lld%lld",&l,&r,&x);
			add_update(l,r,1,n,1,x);
		}
		else
		{
			scanf("%lld%lld",&l,&r);
			printf("%lld\n",query(l,r,1,n,1));
		}
	}
	return 0;
}

2023/9/24 14:57
加载中...