luogu P4513 小白逛公园 2019.8.2

2019.8.2
//by AndyZ #include<cstdio> #include<iostream> #define rint register int #define ls p<<1 #define rs p<<1|1 using namespace std; const int N=5e5+5; int n,m; int a[N]; struct SegmentTree{ int l,r,dat; int lmax,rmax,maxn; }t[N*4]; int read(){ int f=1,x=0;char ch; while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return f*x; } void pushup(int p){ t[p].dat=t[ls].dat+t[rs].dat; t[p].lmax=max(t[ls].dat+t[rs].lmax,t[ls].lmax); t[p].rmax=max(t[rs].dat+t[ls].rmax,t[rs].rmax); t[p].maxn=max(max(t[ls].maxn,t[rs].maxn),t[ls].rmax+t[rs].lmax); } void build(int p,int l,int r){ t[p].l=l,t[p].r=r; if(l==r){t[p].dat=t[p].maxn=t[p].lmax=t[p].rmax=a[l];return ;} int mid=(l+r)/2; build(ls,l,mid); build(rs,mid+1,r); pushup(p); } void add(int p,int x,int k){ if(t[p].l==t[p].r){ t[p].dat=t[p].lmax=t[p].rmax=t[p].maxn=k; return; } int mid=(t[p].l+t[p].r)/2; if(mid>=x){ add(ls,x,k); }else add(rs,x,k); pushup(p); } SegmentTree ask(int p,int l,int r){ if(t[p].l>=l&&t[p].r<=r) return t[p]; int mid=(t[p].l+t[p].r)/2; if(r<=mid) return ask(ls,l,r); else if(l>mid) return ask(rs,l,r); else{ SegmentTree L=ask(ls,l,r),R=ask(rs,l,r),ans; ans.dat = L.dat + R.dat ; ans.lmax = max(L.dat + R.lmax, L.lmax ); ans.rmax = max(R.dat + L.rmax, R.rmax ); ans.maxn = max(max(L.maxn , R.maxn ),L.rmax + R.lmax ); return ans; } } int main(){ n=read(),m=read(); for(rint i=1;i<=n;i++) a[i]=read(); build(1,1,n); for(rint i=1;i<=m;i++){ int opt=read(); if(opt==1){ int a=read(),b=read(); if(a>b) swap(a,b); printf("%d\n",ask(1,a,b).maxn ); }else{ int a=read(),b=read(); add(1,a,b); } } return 0; }

  线段树单点修改 + 区间合并 注意pushup

猜你喜欢

转载自www.cnblogs.com/Ryqwe-csy/p/11290236.html
今日推荐