90求助,最后一个WA,悬赏关注一个
查看原帖
90求助,最后一个WA,悬赏关注一个
882193
Blue_Flower楼主2023/2/25 19:53
#include<bits/stdc++.h>
#define MAXN 1000010
#define ll long long
using namespace std;
ll n,q,w[MAXN*4],lzya[MAXN*4],lzy[MAXN*4],inf;
ll _max(ll a,ll b)
{
	return a>b ? a:b;
}
void build(ll u,ll l,ll r)
{
	if(l==r)
	{
		scanf("%lld",&w[u]);return;
	}
	ll mid=(l+r)/2;
	build(u*2,l,mid);build(u*2+1,mid+1,r);
	w[u]=_max(w[u*2],w[u*2+1]);
	return;
}
void pushdown(ll u)
{
	if(lzy[u]!=inf)
	{
		w[u]=lzy[u];
		lzya[u*2]=lzya[u*2+1]=0;
		lzy[u*2]=lzy[u*2+1]=lzy[u];
	}
	lzy[u]=inf;
	w[u]+=lzya[u];
	lzya[u*2]+=lzya[u];lzya[u*2+1]+=lzya[u];
	lzya[u]=0;
	return;
}
inline bool in(ll l1,ll r1,ll l2,ll r2)
{
	return l1>=l2&&r1<=r2;
}
inline bool out(ll l1,ll r1,ll l2,ll r2)
{
	return r1<l2||l1>r2;
}
void change(ll u,ll l,ll r,ll x,ll y,ll k)
{
	pushdown(u);
	if(in(l,r,x,y))
	{
		lzy[u]=k;pushdown(u);
		return;
	}
	if(!out(l,r,x,y))
	{
	    int mid=(l+r)/2;
	    change(u*2,l,mid,x,y,k);change(u*2+1,mid+1,r,x,y,k);
	    w[u]=_max(w[u*2],w[u*2+1]);
	}
	return;
}
void add(ll u,ll l,ll r,ll x,ll y,ll k)
{
	pushdown(u);
	if(in(l,r,x,y))
	{
		lzya[u]=k;pushdown(u);
		return;
	}
	if(!out(l,r,x,y))
	{
	    int mid=(l+r)/2;
	    add(u*2,l,mid,x,y,k);add(u*2+1,mid+1,r,x,y,k);
	    w[u]=_max(w[u*2],w[u*2+1]);
	}
	return;
}
ll find(ll u,ll l,ll r,ll x,ll y)
{
	pushdown(u);
	if(in(l,r,x,y)) return w[u];
	if(!out(l,r,x,y))
	{
		int mid=(l+r)/2;
		if(out(l,mid,x,y)) return find(u*2+1,mid+1,r,x,y);
		else if(out(mid+1,r,x,y)) return find(u*2,l,mid,x,y);
		else return _max(find(u*2,l,mid,x,y),find(u*2+1,mid+1,r,x,y));
	}
}
int main()
{
	memset(lzy,0x3f3f3f,sizeof(lzy));inf=lzy[0];
	scanf("%d%d",&n,&q);
	build(1,1,n);
	ll op,l,r,x;
	while(q--)
	{
		scanf("%d%d%d",&op,&l,&r);
		switch(op)
		{
			case 1: scanf("%lld",&x);change(1,1,n,l,r,x);break;
			case 2: scanf("%lld",&x);add(1,1,n,l,r,x);break;
			default: printf("%lld\n",find(1,1,n,l,r));
		}
	}
	return 0;
}
2023/2/25 19:53
加载中...