10分求条
查看原帖
10分求条
1162628
Lanpinye_Only楼主2024/10/1 20:16
#include<bits/stdc++.h>
#define ll long long
#define N 1000005
#define ls p<<1
#define rs p<<1|1
#define inf 1e18
using namespace std;
ll c[N<<2],tag1[N<<2]/*加*/,tag2[N<<2]//覆盖;
int n,m;
inline ll read(){
	int x=0;
	bool f=0;
	char c=getchar();
	while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
	while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();
	return f?-x:x; 
}
inline void up(int p){
	c[p]=max(c[ls],c[rs]);
}
inline void down1(int p){
	if(tag2[p]!=inf){
		tag2[ls]=tag2[rs]=tag2[p];
		c[ls]=c[rs]=tag2[p];
		tag2[p]=inf;
		tag1[ls]=tag1[rs]=0;
	}
	return;
}
inline void down2(int p){
	tag1[ls]+=tag1[p];
	tag1[rs]+=tag1[p];
	c[ls]+=tag1[p];
	c[rs]+=tag1[p];
	tag1[p]=0;
	return;
}
void build(int s,int t,int p){
	tag2[p]=inf;
	if(s==t){
		c[p]=read();
		return;
	}
	ll mid=s+t>>1;
	build(s,mid,ls);
	build(mid+1,t,rs);
	up(p);
}
void add(int l,int r,int s,int t,int p,int k){
	if(s>=l&&r>=t){
		c[p]+=k;
		tag1[p]+=k;
		return;
	}
	ll mid=s+t>>1;
	down1(p);
	down2(p);
	if(l<=mid)add(l,r,s,mid,ls,k);
	if(r>mid)add(l,r,mid+1,t,rs,k);
	up(p);
}
void add2(int l,int r,int s,int t,int p,int k){
	if(s>=l&&r>=t){
		c[p]=k;
		tag2[p]=k;
		tag1[p]=0;
		return;
	}
	ll mid=s+t>>1;
	down1(p);
	down2(p);
	if(l<=mid)add(l,r,s,mid,ls,k);
	if(r>mid)add(l,r,mid+1,t,rs,k);
	up(p);
}
ll query(int l,int r,int s,int t,int p){
	if(s>=l&&t<=r){
		return c[p];
	}
	down1(p);
	down2(p);
	ll mid=s+t>>1,a=-1e8;
	if(l<=mid)a=max(query(l,r,s,mid,ls),a);
	if(r>mid)a=max(query(l,r,mid+1,r,rs),a);
	return a;
}
int main(){
	n=read(),m=read();
	build(1,n,1);
	for(int i=1;i<=m;i++){
		ll op,l,r,x;
		op=read(),l=read(),r=read();
		if(op==1){
			x=read();
			add2(l,r,1,n,1,x);
		}
		else if(op==2){
			x=read();
			add(l,r,1,n,1,x);
		}
		else{
			cout<<query(l,r,1,n,1)<<"\n";
		}
	}
} 
2024/10/1 20:16
加载中...