玄关求助
  • 板块灌水区
  • 楼主chty
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/24 13:44
  • 上次更新2025/1/24 16:30:54
查看原帖
玄关求助
1162593
chty楼主2025/1/24 13:44
#include <bits/stdc++.h>
using namespace std;
struct pop{
	int l3,l1,l2,mx;
}a[4000005];
int M=-1e9;
int b[1000005];
int m,n;
int c,d,e;
void biu(int u,int l,int r){
	if(l==r){
		a[u].mx=b[l];
		return;
	}
	int mid=(l+r)/2;
	biu(u*2,l,mid);
	biu(u*2+1,mid+1,r);
	a[u].mx=max(a[u*2].mx,a[u*2+1].mx);
}
void pd(int u){
	if(a[u].l2){
		a[u*2].mx=a[u].l1;
		a[u*2].l1=a[u*2].l1;
		a[u*2+1].mx=a[u].l1;
		a[u*2+1].l1=a[u*2].l1;
		a[u].l2=0;
		a[u*2].l2=1;
		a[u*2+1].l2=1;
	}
	a[u*2].mx+=a[u].l3;
	a[u*2+1].mx+=a[u].l3;
	a[u*2].l3+=a[u].l3;
	a[u*2+1].l3+=a[u].l3;
	a[u].l3=0,a[u].l1=0;
}
void kp(int u,int l,int r,int L,int R,int j){
	if(L<=l&&r<=R){
		a[u].mx=j;
		a[u].l1=j;
		a[u].l2=1;
		a[u].l3=0;
		return;
	}
	if(l>R||r<L) return;
	pd(u);
	int mid=(l+r)/2;
	kp(u*2,l,mid,L,R,j);
	kp(u*2+1,mid+1,r,L,R,j);
	a[u].mx=max(a[u*2].mx,a[u*2+1].mx );
}
void apc(int u,int l,int r,int L,int R,int j){
	if(L<=l&&r<=R){
		a[u].mx+=j;
		a[u].l3+=j;
		return;
	}
	if(l>R||r<L) return;
	pd(u);
	int mid=(l+r)/2;
	kp(u*2,l,mid,L,R,j);
	kp(u*2+1,mid+1,r,L,R,j);
	a[u].mx=max(a[u*2].mx,a[u*2+1].mx );
}
int ask(int u,int l,int r,int L,int R){
	if(L<=l&&r<=R){
		return a[u].mx;
	}
	if(L>r||R<l){
		return M;
	}
	pd(u);
	int mid=(l+r)/2;
	return max(ask(u*2,l,mid,L,R),ask(u*2+1,mid+1,r,L,R));
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>b[i];
	}
	biu(1,1,n);
	while(m--){
		int k;
		cin>>c>>d>>e;
		if(c==1){
			cin>>k;
			kp(1,1,n,d,e,k);
		}else if(c==2){
			cin>>k;
			apc(1,1,n,d,e,k);
		}else{
			cout<<ask(1,1,n,d,e)<<endl;
		}
	}
	return 0;
}

题目传送门

2025/1/24 13:44
加载中...