20分求调
查看原帖
20分求调
819516
liusir146楼主2024/4/19 18:20

并且re一个点

#include<bits/stdc++.h>
#define int long long
#define lc x<<1
#define rc ((x<<1)|1)
#define mid (l+r>>1)
#define none -11451419
using namespace std;
const int N=1e6+10;
int a[N],n,m;
inline int r(){
	int f=1,x=0;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while('0'<=ch&&ch<='9'){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar(); 
	}
	return f*x;
}
struct Node{
	int l,r,add,maxx,sum,cover;
}tr[N<<2];
void pushup(int x){
	tr[x].sum=tr[lc].sum+tr[rc].sum;
	tr[x].maxx=max(tr[lc].maxx,tr[rc].maxx);
}
void build(int x,int l,int r){
	if(l==r){
		tr[x].maxx=a[l];
		tr[x].sum=a[l];
		tr[x].cover=none;
		return ;
	}
	build(lc,l,mid);
	build(rc,mid+1,r);
	pushup(x);
}
void coverdown(int x){
	if(tr[x].cover !=none){
		tr[lc].sum=tr[rc].sum=0;
		tr[lc].maxx=tr[rc].maxx=tr[x].cover;
		tr[lc].cover=tr[rc].cover=tr[x].cover;
		tr[x].cover=none;  
	}
}
void pushdown(int x,int l,int r){
	int v=tr[x].add;
	tr[lc].add+=v,tr[rc].add+=v;
	tr[x].add=0;
	tr[lc].sum+=(mid-l+1)*v,tr[rc].sum+=(r-mid)*v;
	tr[x].maxx=max(tr[lc].maxx,tr[rc].maxx);
	coverdown(x);
}
void coveradd(int x,int l,int r,int from,int to,int v){
	if(from<=l&&to>=r){
		tr[x].sum=0;
		tr[x].maxx=v;
		tr[x].cover=v;
		return ;
	}
	pushdown(x,l,r);
	if(from<=mid)coveradd(lc,l,mid,from,to,v);
	if(to>=mid+1)coveradd(rc,mid+1,r,from,to,v);
	pushup(x);
}
void change(int x,int l,int r,int from,int to,int v){
	if(from<=l&&r<=to){
		coverdown(x);
		tr[x].add+=v,tr[x].maxx+=v;
		return ;
	}
	pushdown(x,l,r);
	if(from<=mid)change(lc,l,mid,from,to,v);
	if(to>mid)change(rc,mid+1,r,from,to,v);
	pushup(x);
}
int query(int x,int l,int r,int from,int to){
	if(from<=l&&r<=to){
		return tr[x].maxx;
	}
	pushdown(x,l,r);
	int res=-114514;
	if(from<=mid)res=max(res,query(lc,l,mid,from,to));
	if(to>mid)res=max(res,query(rc,mid+1,r,from,to));
	return res;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	while(m--){
		int op,xx,yy,k;
		cin>>op;
		if(op==1){
			xx=r(),yy=r(),k=r();
			coveradd(1,1,n,xx,yy,k);
		}
		if(op==2){
			xx=r(),yy=r(),k=r();
			change(1,1,n,xx,yy,k);
		}
		if(op==3){
			xx=r(),yy=r();
			cout<<query(1,1,n,xx,yy)<<endl;
		}
	}
	return 0;
}
2024/4/19 18:20
加载中...