10分求调,样例未过
查看原帖
10分求调,样例未过
661913
liwenxi1145144444楼主2024/4/4 16:43
#include<bits/stdc++.h>
#define int long long
#define ls k<<1
#define rs k<<1|1
#define pup tree[k].maxn=max(tree[ls].maxn,tree[rs].maxn)
#define qmi int mid=(tree[k].l+tree[k].r)>>1
using namespace std;
int n,m,a[1000005];
struct node{
	int l,r,maxn,fgtag,smtag;
}tree[4000005];
inline void build(int l,int r,int k){
	tree[k].l=l;
	tree[k].r=r;
	if(l==r){
		tree[k].maxn=a[l];
		tree[k].fgtag=1e9+1;
		return ;
	}
	qmi;
	build(l,mid,ls);
	build(mid+1,r,rs);
	pup;
}
inline void coverpd(int k){
	if(tree[k].fgtag!=1e9+1){
		tree[ls].smtag=tree[rs].smtag=0;
		tree[ls].maxn=tree[rs].maxn=tree[k].fgtag;
		tree[ls].fgtag=tree[rs].fgtag=tree[k].fgtag;
		tree[k].fgtag=1e9+1;
	}
	return ;
}
inline void sumpd(int k){
	if(tree[k].smtag){
		coverpd(k);
		tree[ls].maxn+=tree[k].smtag;
		tree[rs].maxn+=tree[k].smtag;
		tree[ls].smtag+=tree[k].smtag;
		tree[rs].smtag+=tree[k].smtag;
		tree[k].smtag=0;
	}
	return ;
}
inline void update1(int l,int r,int x,int k){
	if(tree[k].l<=l&&tree[k].r>=r){
		tree[k].fgtag=x;
		tree[k].smtag=0;
		tree[k].maxn=x;
		return  ;
	}
	coverpd(k);
	sumpd(k);
	qmi;
	if(l<=mid){
		update1(l,r,x,ls);
	}
	if(r>mid){
		update1(l,r,x,rs);
	}
	pup;
	return ;
}
inline void update2(int l,int r,int x,int k){
	if(tree[k].l<=l&&tree[k].r>=r){
		coverpd(k);
		tree[k].maxn+=x;
		tree[k].smtag+=x;
		return  ;
	}
	coverpd(k);
	sumpd(k);
	qmi;
	if(l<=mid){
		update2(l,r,x,ls);
	}
	if(r>mid){
		update2(l,r,x,rs);
	}
	pup;
	return ;
}
inline int query(int l,int r,int k){
	if(tree[k].l<=l&&tree[k].r>=r){
		return tree[k].maxn;
	}
	coverpd(k);
	sumpd(k);
	qmi;
	int maxn=INT_MIN;
	if(l<=mid){
		maxn=max(maxn,query(l,r,ls));
	}
	if(r>mid){
		maxn=max(maxn,query(l,r,rs));
	}
	return maxn;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=4*n;i++){
		tree[i].fgtag=1e9+1;
	}
	build(1,n,1);
	while(m--){
		int id;
		cin>>id;
		if(id==1){
			int x,y,z;
			cin>>x>>y>>z;
			update1(x,y,z,1); 
		}else if(id==2){
			int x,y,z;
			cin>>x>>y>>z;
			update2(x,y,z,1);
		}else{
			int x,y;
			cin>>x>>y;
			cout<<query(x,y,1)<<"\n";
		}
	}
	return 0;
}
2024/4/4 16:43
加载中...