悬3个关求调
查看原帖
悬3个关求调
1419569
Z_kazuha楼主2024/8/14 21:15
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1000005;
ll ls(ll p){return p<<1;}
ll rs(ll p){return p<<1|1;}
ll n,q;
ll a[N],tree[N<<2],tagp[N<<2],tagm[N<<2];
void pushup(ll p){
	tree[p]=max(tree[ls(p)],tree[rs(p)]);
}
void build(ll p,ll pl,ll pr){
	if(pl==pr){
		tree[p]=a[pl];
		return;
	}
	ll mid=(pl+pr)>>1;
	build(ls(p),pl,mid);
	build(rs(p),mid+1,pr);
	pushup(p);
}
void addtag(ll p,ll x,ll o){
	if(o==1){
		tagp[p]=0;
		tree[p]=x;
		tagm[p]=x; 
	}else{
		if(tagm[p]){
			tagm[p]+=x;
			tree[p]+=x;
		}else{
			tagp[p]+=x;
			tree[p]+=x;
		}
	}
}
void pushdown(ll p){
	if(tagm[p]){
		addtag(ls(p),tagm[p],1);
		addtag(rs(p),tagm[p],1);
		tagm[p]=0;
		tagp[p]=0;
	}else{
		addtag(ls(p),tagp[p],0);
		addtag(rs(p),tagp[p],0);
		tagp[p]=0;
	}
}
void update(ll p,ll L,ll R,ll pl,ll pr,ll x,ll o){
	if(L<=pl&&R>=pr){
		addtag(p,x,o);
		return;
	}
	pushdown(p);
	ll mid=(pl+pr)>>1;
	if(L<=mid)update(ls(p),L,R,pl,mid,x,o);
	if(R>mid)update(rs(p),L,R,mid+1,pr,x,o);
	pushup(p);
}
ll query(ll p,ll L,ll R,ll pl,ll pr){
	if(L<=pl&&R>=pr){
		return tree[p];
	}
	pushdown(p);
	ll res=-0x3ffff;
	ll mid=(pl+pr)>>1;
	if(L<=mid)res=max(res,query(p,L,R,pl,mid));
	if(R>mid)res=max(res,query(p,L,R,mid+1,pr));
	return res;
}
int main(){
	ios::sync_with_stdio(false);
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	for(int i=1;i<=q;i++){
		ll o,l,r,x;
		cin>>o>>l>>r;
		if(o==3){
			cout<<query(1,l,r,1,n)<<endl;
		}else{
			cin>>x;
			update(1,l,r,1,n,x,o);
		//	for(int i=1;i<=(n<<2);i++)cout<<tree[i]<<" ";
		}
	}
	return 0;
}
2024/8/14 21:15
加载中...