#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const int maxn=500005;
const ll inf=1e18;
struct Seg_Tree{
ll Add[maxn<<2],Fuz[maxn<<2],Maxadd[maxn<<2],Maxfuz[maxn<<2];
void create_tree(int p,int l,int r){
if(l==r){
scanf("%lld",&Add[p]);
Maxadd[p]=Maxfuz[p]=Fuz[p]=Add[p];
return;
}
int mid=(l+r)>>1,u=p<<1,v=u+1;
create_tree(u,l,mid);
create_tree(v,mid+1,r);
}
void upd(int p,ll add,ll fuz,ll maxadd,ll maxfuz){
Maxadd[p]=max(Maxadd[p],maxadd+Add[p]);
Maxfuz[p]=max(max(Maxfuz[p],maxfuz),Fuz[p]+maxadd);
Add[p]=max(Add[p]+add,-inf);
Fuz[p]=max(Fuz[p]+add,fuz);
}
void push_down(int p,int u,int v){
upd(u,Add[p],Fuz[p],Maxadd[p],Maxfuz[p]);
upd(v,Add[p],Fuz[p],Maxadd[p],Maxfuz[p]);
Add[p]=Fuz[p]=Maxadd[p]=Maxfuz[p]=0;
}
void update(int p,int l,int r,int L,int R,ll add,ll fuz){
if((L<=l)&&(R>=r))
return upd(p,add,fuz,add,fuz);
int mid=(l+r)>>1,u=p<<1,v=u+1;
push_down(p,u,v);
if(L<=mid)update(u,l,mid,L,R,add,fuz);
if(R>mid)update(v,mid+1,r,L,R,add,fuz);
}
ll query(int p,int l,int r,int pos,int type){
if((pos==l)&&(pos==r)){
if(type==0)return Fuz[p];
else return Maxfuz[p];
}
int mid=(l+r)>>1,u=p<<1,v=u+1;
push_down(p,u,v);
if(pos<=mid)return query(u,l,mid,pos,type);
else return query(v,mid+1,r,pos,type);
}
}T;
int main(){
int n,m;
scanf("%d%d",&n,&m);
T.create_tree(1,1,n);
while(m--){
int type,l,r,x;
scanf("%d",&type);
if(type<=3){
scanf("%d%d%d",&l,&r,&x);
ll add,fuz;
if(type==1)add=x,fuz=0;
else if(type==2)add=-x,fuz=0;
else add=-inf,fuz=x;
T.update(1,1,n,l,r,add,fuz);
}else{
scanf("%d",&x);
printf("%lld\n",T.query(1,1,n,x,type-4));
}
}
return 0;
}
UOJ164--历史最值维护
最新推荐文章于 2021-08-25 15:30:13 发布