20pts求助!(玄关)
查看原帖
20pts求助!(玄关)
965382
_OccDreamer_楼主2023/8/27 19:14

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
int n,q,op,x,y,k,a[N],tag1[N<<2],tag2[N<<2],ans[N<<2];
inline int ls(int p) {return p<<1;}
inline int rs(int p) {return p<<1|1;}
inline void push_up(int p) {ans[p]=max(ans[ls(p)],ans[rs(p)]);}
inline void build(int p,int l,int r) {
	tag1[p]=tag2[p]=-2e18;
	if(l==r) {
		ans[p]=a[l];
		return;
	}
	int mid=l+r>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	push_up(p);
}
inline void f1(int p,int l,int r,int k) {tag2[p]=0,tag1[p]=k,ans[p]=k;}
inline void f2(int p,int l,int r,int k) {tag2[p]+=k,ans[p]+=k*(r-l+1);}
inline void push_down_cover(int p,int l,int r) {
	if(tag1[p]!=-2e18) {
		int mid=l+r>>1;
		f1(ls(p),l,mid,tag1[p]);
		f1(rs(p),mid+1,r,tag1[p]);
		tag1[p]=-2e18;
	}
}
inline void push_down_sum(int p,int l,int r) {
	if(tag2[p]!=-2e18) {
		push_down_cover(p,l,r);
		int mid=l+r>>1;
		f2(ls(p),l,mid,tag2[p]);
		f2(rs(p),mid+1,r,tag2[p]);
		tag2[p]=0;
	}
}
inline void push_down(int p,int l,int r) {push_down_sum(p,l,r),push_down_cover(p,l,r);}
inline void add1(int x,int y,int k,int l,int r,int p) {
	if(x<=l&&r<=y) {
		f2(p,l,r,k);
		return;
	}
	push_down(p,l,r);
	int mid=l+r>>1;
	if(x<=mid) add1(x,y,k,l,mid,ls(p));
	if(y>mid) add1(x,y,k,mid+1,r,rs(p));
	push_up(p);
}
inline void add2(int x,int y,int k,int l,int r,int p) {
	if(x<=l&&r<=y) {
		f1(p,l,r,k);
		return;
	}
	push_down(p,l,r);
	int mid=l+r>>1;
	if(x<=mid) add2(x,y,k,l,mid,ls(p));
	if(y>mid) add2(x,y,k,mid+1,r,rs(p));
	push_up(p);
}
inline int gtmx(int x,int y,int l,int r,int p) {
	int res=-2e18;
	if(x<=l&&r<=y) return ans[p];
	push_down(p,l,r);
	int mid=l+r>>1;
	if(x<=mid) res=max(res,gtmx(x,y,l,mid,ls(p)));
	if(y>mid) res=max(res,gtmx(x,y,mid+1,r,rs(p)));
	return res;
}
signed main() {
	ios_base::sync_with_stdio(NULL);
	cin.tie(nullptr);
	cout.tie(nullptr);
	cin>>n>>q;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	build(1,1,n);
	while(q--) {
		cin>>op>>x>>y;
		if(op==1) cin>>k,add2(x,y,k,1,n,1);
		else if(op==2) cin>>k,add1(x,y,k,1,n,1);
		else cout<<gtmx(x,y,1,n,1)<<'\n'; 
	}
	return 0;
}
2023/8/27 19:14
加载中...