10分求条
查看原帖
10分求条
1135546
qwp____5_0_3楼主2024/12/20 17:13
#include<bits/stdc++.h>
#define N 1000010
#define ll long long 
ll ls(ll p){return p<<1;}
ll rs(ll p){return p<<1|1;}

using namespace std;
ll a[N],tag1[N<<2],tag2[N<<2],tree[N<<2];
int n,m;
void push_up(int p){tree[p]=max(tree[ls(p)],tree[rs(p)]);}
void build(int p,int pl,int pr)
{
	tag1[p]=tag2[p]=0;
	if(pl==pr){tree[p]=a[pl];return ;}
	int mid=(pl+pr)>>1;
	build(ls(p),pl,mid);
	build(rs(p),mid+1,pr);
	push_up(p);
}
void add_tag1(int p,int pl,int pr,ll d)
{
	tag1[p]=(pr-pl+1)*d-tree[p];
	tree[p]=d;	
}
void add_tag2(int p,int pl,int pr,ll d)
{
	tag2[p]+=d;
	tree[p]+=d;
}

void push_down1(int p,int pl,int pr)
{
	if(!tag1[p])return ;
	int mid=(pl+pr)>>1;
	add_tag1(ls(p),pl,mid,tag1[p]);
	add_tag1(rs(p),mid+1,pr,tag1[p]);
	tag1[p]=0;
}
void push_down2(int p,int pl,int pr)
{
	if(!tag2[p])return ;
	int mid=(pl+pr)>>1;
	add_tag2(ls(p),pl,mid,tag2[p]);
	add_tag2(rs(p),mid+1,pr,tag2[p]);
	tag2[p]=0;
}
void update(int L,int R,int p,int pl,int pr,ll d)
{
	if(L<=pl&&R>=pr)
	{
		add_tag1(p,pl,pr,d);
		add_tag2(p,pl,pr,d);
		return ;
	}
	push_down1(p,pl,pr);
	push_down2(p,pl,pr);
	int mid=(pl+pr)>>1;
	if(L<=mid)update(L,R,ls(p),pl,mid,d);
	if(R>=mid+1)update(L,R,rs(p),mid+1,pr,d);
	push_up(p);
}

ll query(int L,int R,int p,int pl,int pr)
{
	if(L<=pl&&R>=pr)return tree[p];
	push_down1(p,pl,pr);
	push_down2(p,pl,pr);
	ll ans=-2e18;
	int mid=(pl+pr)>>1;
	if(L<=mid)ans=max(ans,query(L,R,ls(p),pl,mid));
	if(R>=mid+1)ans=max(ans,query(L,R,rs(p),mid+1,pr));
	return ans;
}

int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		ll x;
		int op,l,r;
		cin>>op;
		if(op==1)
		{
			cin>>l>>r>>x;
			update(l,r,1,1,n,x);
		}
		if(op==2)
		{
			cin>>l>>r>>x;
			update(l,r,1,1,n,x);
		}
		if(op==3)
		{
			cin>>l>>r;
			cout<<query(l,r,1,1,n)<<"\n";
		}
	}
	return 0;
}

代码求调

2024/12/20 17:13
加载中...