50pts求助
查看原帖
50pts求助
737014
Xuwindows_WS楼主2024/7/15 21:15
#include<bits/stdc++.h>
using namespace std;
long long a[1000010];
long long tr[4000040];
long long lza[4000040];
long long lzu[4000040];
bool vis[4000040];
void build(long long l,long long r,long long id)
{
	if(l==r)
	{
		tr[id]=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(l,mid,id*2);
	build(mid+1,r,id*2+1);
	tr[id]=max(tr[id*2],tr[id*2+1]);
}
void add(long long lu,long long ru,long long ln,long long rn,long long id,long long k)
{
	if(lu<=ln&&ru>=rn)
	{
		tr[id]+=k;
		lza[id]+=k;
		return;
	}
	long long mid=(ln+rn)/2;
	if(lza[id]!=0&&ln!=rn)
	{
		tr[id*2]+=lza[id];
		tr[id*2+1]+=lza[id];
		lza[id*2]+=lza[id];
		lza[id*2+1]+=lza[id];
		lza[id]=0;
	}
	if(lu<=mid)add(lu,ru,ln,mid,id*2,k);
	if(ru>mid)add(lu,ru,mid+1,rn,id*2+1,k);
	tr[id]=max(tr[id*2],tr[id*2+1]);
}
void upd(long long lu,long long ru,long long ln,long long rn,long long id,long long k)
{
//	cout<<' '<<lu<<' '<<ru<<' '<<ln<<' '<<rn<<' '<<id<<' '<<k<<endl;
//	cout<<tr[id]<<' '<<lzu[id]<<endl;
	if(lu<=ln&&ru>=rn)
	{
		tr[id]=k;
		lzu[id]=k;
		vis[id]=false;
		return;
	}
	long long mid=(ln+rn)/2;
	if(!vis[id]&&ln!=rn)
	{
		tr[id*2]=lzu[id];
		tr[id*2+1]=lzu[id];
		lzu[id*2]=lzu[id];
		lzu[id*2+1]=lzu[id];
		lzu[id]=0;
		vis[id]=true;
	}
//	cout<<tr[id]<<' '<<lzu[id]<<endl;
	if(lu<=mid)upd(lu,ru,ln,mid,id*2,k);
//	cout<<tr[id]<<' '<<lzu[id]<<endl;
	if(ru>mid)upd(lu,ru,mid+1,rn,id*2+1,k);
//	cout<<tr[id]<<' '<<lzu[id]<<endl;
	tr[id]=max(tr[id*2],tr[id*2+1]);
//	cout<<tr[id]<<' '<<lzu[id]<<endl;
}
long long getmax(long long lc,long long rc,long long ln,long long rn,long long id)
{
	if(lc<=ln&&rc>=rn)
	{
		return tr[id];
	}
	long long mid=(ln+rn)/2;
	if(lza[id]!=0)
	{
		tr[id*2]+=lza[id];
		tr[id*2+1]+=lza[id];
		lza[id*2]+=lza[id];
		lza[id*2+1]+=lza[id];
		lza[id]=0;
	}
	if(lzu[id]!=0)
	{
		tr[id*2]=lzu[id];
		tr[id*2+1]=lzu[id];
		lzu[id*2]=lzu[id];
		lzu[id*2+1]=lzu[id];
		lzu[id]=0;
	}
	long long maxn=0;
	if(lc<=mid)maxn=max(getmax(lc,rc,ln,mid,id*2),maxn);
	if(rc>mid)maxn=max(getmax(lc,rc,mid+1,rn,id*2+1),maxn);
	return maxn;
}
int main()
{
	long long n,m;
	scanf("%lld%lld",&n,&m);
	for(long long i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
	}
	build(1,n,1);
	for(long long i=1;i<=m;i++)
	{
		int op;
		scanf("%lld",&op);
		if(op==1)
		{
			long long x,y,k;
			scanf("%lld%lld%lld",&x,&y,&k);
			upd(x,y,1,n,1,k);
		}
		else if(op==2)
		{
			long long x,y,k;
			scanf("%lld%lld%lld",&x,&y,&k);
			add(x,y,1,n,1,k);
		}
		else if(op==3)
		{
			long long x,y;
			scanf("%lld%lld",&x,&y);
			cout<<getmax(x,y,1,n,1)<<endl;
		}
	}
	return 0;
}
2024/7/15 21:15
加载中...