40pts求调(玄关)
查看原帖
40pts求调(玄关)
1013837
Tiskan_H楼主2024/7/13 20:57

谢谢大佬!

#include<bits/stdc++.h>
#define int long long
#define N 1000010
using namespace std;

int n,m;
int a[N];

struct node{
	int l,r;
	int dat,laz,lat;
}tr[4*N];

void build(int p,int l,int r){
	tr[p].l=l,tr[p].r=r;
	if(l==r){
		tr[p].dat=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(2*p,l,mid);
	build(2*p+1,mid+1,r);
	tr[p].dat=max(tr[2*p].dat,tr[2*p+1].dat);
	tr[p].lat=-1e18;
}
void spread(int p){
	if(tr[p].lat>-1e18){
		tr[2*p].dat=tr[p].lat,tr[2*p+1].dat=tr[p].lat;
		tr[2*p].lat=tr[p].lat;
		tr[2*p+1].lat=tr[p].lat;
		tr[p].lat=0;
	}
	if(tr[p].laz){
		tr[2*p].dat=max(tr[2*p].dat+tr[p].laz,tr[2*p].dat);
		tr[2*p+1].dat=max(tr[2*p+1].dat+tr[p].laz,tr[2*p+1].dat);
		tr[2*p].laz+=tr[p].laz;
		tr[2*p+1].laz+=tr[p].laz;
		tr[p].laz=0;
	}
}
void change(int p,int l,int r,int k){
	if(l<=tr[p].l&&tr[p].r<=r){
		tr[p].laz+=k,
		tr[p].dat=max(tr[p].dat+k,tr[p].dat);
		return;
	}
	spread(p);
	int mid=(tr[p].l+tr[p].r)/2;
	if(l<=mid) change(2*p,l,r,k);
	if(r>mid) change(2*p+1,l,r,k);
	tr[p].dat=max(tr[2*p].dat,tr[2*p+1].dat);
}
void turn(int p,int l,int r,int k){
	if(l<=tr[p].l&&tr[p].r<=r){
		tr[p].laz=k,
		tr[p].dat=k;
		return;
	}
	spread(p);
	int mid=(tr[p].l+tr[p].r)/2;
	int val=-1e18;
	if(l<=mid) turn(2*p,l,r,k);
	if(r>mid) turn(2*p+1,l,r,k);
	tr[p].dat=k;
}
int ask(int p,int l,int r){
	if(l<=tr[p].l&&tr[p].r<=r)
		return tr[p].dat;
	spread(p);
	int mid=(tr[p].l+tr[p].r)/2;
	int val=-1e20;
	if(l<=mid) val=max(ask(2*p,l,r),val);
	if(r>mid) val=max(ask(2*p+1,l,r),val);
	return val;
}

signed main(){
	std::cin>>n>>m;
	for(int i=1;i<=n;i++)
		std::cin>>a[i];
	build(1,1,n);
	//for(int i=1;i<=2*n+1;i++)
	//	cout<<tr[i].l<<","<<tr[i].r<<":"<<tr[i].dat<<endl;
	for(int i=1;i<=m;i++){
		int xs;
		std::cin>>xs;
		if(xs==2){
			int x,y,k;
			std::cin>>x>>y>>k;
			change(1,x,y,k);
		}else if(xs==1){
			int x,y,k;
			std::cin>>x>>y>>k;
			//turn(1,x,y,k);
		}else{
			int l,r;
			std::cin>>l>>r;
			std::cout<<ask(1,l,r)<<"\n";
		}
		//for(int i=1;i<=2*n+1;i++)
		//	cout<<tr[i].l<<","<<tr[i].r<<":"<<tr[i].dat<<endl;
	}
	return 0;
}

/*
8 8
23 45 645 -32 34 9 -12 5
2 1 8 1
*/


2024/7/13 20:57
加载中...