60求调(玄关
查看原帖
60求调(玄关
1234353
_Firefly__楼主2024/9/11 22:26
#include<bits/stdc++.h>
#define lp p<<1
#define rp p<<1|1
#define int long long
using namespace std;
const int N=1e6+10;
int read(){
	int x=0,f=1;
	char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(isdigit(ch)){
		x=x*10+ch-48;
		ch=getchar();
	}
	return x*f;
}
struct tree{
	int add,xg,mx,used;
}tag[N<<2];
int a[N],n,m;
void pushup(int p){
	tag[p].mx=max(tag[lp].mx,tag[rp].mx); 
}
void build(int p,int l,int r){
	tag[p].mx=-1e18;
	if(l==r){
		tag[p].mx=a[l];
		return ;
	}
	int mid=l+r>>1;
	build(lp,l,mid);
	build(rp,mid+1,r);
	pushup(p);
}
void pushdown(int p){
	if(tag[p].used==0){
		tag[lp].add+=tag[p].add;
		tag[rp].add+=tag[p].add;
		tag[lp].mx+=tag[p].add;
		tag[rp].mx+=tag[p].add;
	}
	else {
		tag[lp].xg=tag[p].xg;
		tag[rp].xg=tag[p].xg;
		tag[lp].add+=tag[p].add;
		tag[rp].add+=tag[p].add;
		tag[lp].mx=tag[p].xg+tag[p].add;
		tag[rp].mx=tag[p].xg+tag[p].add;
		tag[lp].used=tag[rp].used=1;
	}
	tag[p].used=0;
	tag[p].add=0;
	tag[p].xg=0;
	
}
void update(int p,int l,int r,int L,int R,int c){
	if(l>R||r<L)return;
	if(l>=L&&r<=R){
		tag[p].add+=c;
		tag[p].mx+=c;
		return;
	}
	pushdown(p);
	int mid=l+r>>1;
	update(lp,l,mid,L,R,c);
	update(rp,mid+1,r,L,R,c);
	pushup(p);
}
void change(int p,int l,int r,int L,int R,int c){
	if(l>R||r<L)return;
	if(l>=L&&r<=R){
		tag[p].xg=c;
		tag[p].mx=c;
		tag[p].add=0;
		tag[p].used=1;
		return;
	}
	pushdown(p);
	int mid=l+r>>1;
	change(lp,l,mid,L,R,c);
	change(rp,mid+1,r,L,R,c);
	pushup(p);
}
int query(int p,int l,int r,int L,int R){
	if(l>R||r<L)return -1e18;
	if(l>=L&&r<=R){
		return tag[p].mx;
	}
	pushdown(p);
	int mid=l+r>>1;
	int res=-1e18;
	res=max(res,query(lp,l,mid,L,R));
	res=max(res,query(rp,mid+1,r,L,R));
	return res;
	
}
signed main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++)a[i]=read();
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int opt=read(),l=read(),r=read(),x;
		if(opt==2){
			x=read();
			update(1,1,n,l,r,x);
		}
		else if(opt==1){
			x=read();
			change(1,1,n,l,r,x);
		}
		else printf("%lld\n",query(1,1,n,l,r));
	}
}
2024/9/11 22:26
加载中...