50分代码求助
查看原帖
50分代码求助
313674
epiphanyer楼主2023/6/1 17:37
#include <bits/stdc++.h>
#define ls (p<<1)
#define rs ((p<<1)|1)
typedef long long ll;
using namespace std;
const int maxn=1e6+5;
const int INF=-1e9-5;
int n,q,a[maxn],op,opl,opr;
ll opx;
ll t[maxn<<2],taga[maxn<<2],tagc[maxn<<2];
ll smax(ll a,ll b){
	return a>b?a:b;
}
void pushup(int p){
	t[p]=smax(t[ls],t[rs]);
}
void build(int p,int l,int r){
	tagc[p]=INF;
	if(l==r){
		t[p]=(ll)a[l];
		return ;
	}
	int mid=((l+r)>>1);
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(p);
}
void pushdown(int p,int l,int r){
	if(tagc[p]!=INF){
		t[ls]=tagc[p];
		t[rs]=tagc[p];
		tagc[ls]=tagc[rs]=tagc[p];
		taga[ls]=taga[rs]=0;
		tagc[p]=INF;
	}
	if(taga[p]){
		t[ls]+=taga[p];
		t[rs]+=taga[p];
		taga[ls]+=taga[p];
		taga[rs]+=taga[p];
		taga[p]=0;
	}
}
void change(int p,int l,int r,int ql,int qr,ll k){
	if(l>=ql&&r<=qr){
		t[p]=k;
		tagc[p]=k;
		taga[p]=0;
		return ;
	}
	int mid=((l+r)>>1);
	pushdown(p,l,r);
	if(ql<=mid)change(ls,l,mid,ql,qr,k);
	if(qr>mid)change(rs,mid+1,r,ql,qr,k);
	pushup(p);
}
void add(int p,int l,int r,int ql,int qr,ll k){
	if(l>=ql&&r<=qr){
		t[p]+=k;
		taga[p]+=k;
		return ;
	}
	int mid=((l+r)>>1);
	pushdown(p,l,r);
	if(ql<=mid)add(ls,l,mid,ql,qr,k);
	if(qr>mid)add(rs,mid+1,r,ql,qr,k);
	pushup(p);
}
ll query(int p,int l,int r,int ql,int qr){
	if(l>=ql&&r<=qr){
		return t[p];
	}
	int mid=(l+r)>>1;
	ll ret=INF;
	pushdown(p,l,r);
	if(ql<=mid)ret=smax(query(ls,l,mid,ql,qr),ret);
	if(qr>mid)ret=smax(query(rs,mid+1,r,ql,qr),ret);
	return ret;
}
int main(){
//	freopen("P1253_6.in","r",stdin);
//	freopen("P1253_6.ans","w",stdout);
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	build(1,1,n);
	while(q--){
		scanf("%d%d%d",&op,&opl,&opr);
		if(op==1){
			scanf("%lld",&opx);
			change(1,1,n,opl,opr,opx);
		}
		if(op==2){
			scanf("%lld",&opx);
			add(1,1,n,opl,opr,opx);
		}
		if(op==3){
			printf("%lld\n",query(1,1,n,opl,opr));
		}
	}
	return 0;
} 
2023/6/1 17:37
加载中...