60分求条玄关马蜂良好ovo
查看原帖
60分求条玄关马蜂良好ovo
1348953
never_give_u_up楼主2025/6/14 19:16
#include <bits/stdc++.h>
#define int long long
#define un unsigned
using namespace std;
inline int read(){int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}return x*f;}
const int N = 1e6+5;
const int MIN=LLONG_MIN;
int sum[4*N],tag1[4*N],tag2[4*N],a[N];
int ls(int x){
	return x<<1;
}
int rs(int x){
	return x<<1|1;
}
void add1(int x,int l,int r,int k){
	sum[x]+=k;
	tag1[x]+=k;
}
void add2(int x,int l,int r,int k){
	sum[x]=k;
	tag2[x]=k;
}
void pushdown(int x,int l,int r){
	int mid=(l+r)>>1;
	
	if(tag2[x]!=MIN){
		tag1[ls(x)]=tag1[rs(x)]=0;
		add2(ls(x),l,mid,tag2[x]);
		add2(rs(x),mid+1,r,tag2[x]);
		tag2[x]=MIN;
	}
	if(tag1[x]!=0){
		add1(ls(x),l,mid,tag1[x]);
		add1(rs(x),mid+1,r,tag1[x]);
		tag1[x]=0;
	}
}
void pushup(int x){
	sum[x]=max(sum[ls(x)],sum[rs(x)]);
	return;
}
void build(int x,int l,int r){
	tag2[x]=MIN;
	if(l==r){
		sum[x]=a[l];
		return;
	}
	int mid = (l+r)>>1;
	build(ls(x),l,mid);
	build(rs(x),mid+1,r);
	pushup(x);
	return; 
}
void update(int x,int l,int r,int L,int R,int k){
	if(L<=l && r<=R){
		add1(x,l,r,k);
		return;
	}
	pushdown(x,l,r);
	int mid=(l+r)>>1;
	if(L<=mid) update(ls(x),l,mid,L,R,k);
	if(mid<R) update(rs(x),mid+1,r,L,R,k);
	pushup(x);
}
void update1(int x,int l,int r,int L,int R,int k){
	if(L<=l && r<=R){
		add2(x,l,r,k);
		return;
	}
	pushdown(x,l,r);
	int mid=(l+r)>>1;
	if(L<=mid) update1(ls(x),l,mid,L,R,k);
	if(mid<R) update1(rs(x),mid+1,r,L,R,k);
	pushup(x);
}
int query(int x,int l,int r,int L,int R){
	if(L<=l && r<=R){
		return sum[x];
	}
	pushdown(x,l,r);
	int mid=(l+r)>>1;
	int ret = MIN;
	if(L<=mid) ret=max(ret,query(ls(x),l,mid,L,R));
	if(mid<R) ret=max(ret,query(rs(x),mid+1,r,L,R));
	return ret;
}
int n,q;
signed main(){
	n=read();q=read();
	for(int i = 1;i<=n;i++){
		a[i]=read();
	}
	build(1,1,n);
	while(q--){
		int opt;
		opt=read();
		int l,r;
		l=read();r=read();
		if(opt==1){
			int x;x=read();
			update1(1,1,n,l,r,x);
		}
		else if(opt==2){
			int x;x=read();
			update(1,1,n,l,r,x);
		}
		else{
			cout<<query(1,1,n,l,r)<<"\n";
		}
	}
	return 0;
}

WA#7-#10 感觉所有的错误都注意到了

2025/6/14 19:16
加载中...