SPOJ GSS3 Can you answer these queries III[线段树]
2016-11-16 08:41
579 查看
Description
YouaregivenasequenceAofN(N<=50000)integersbetween-10000and10000.OnthissequenceyouhavetoapplyM(M<=50000)operations:
modifythei-thelementinthesequenceorforgivenxyprintmax{Ai+Ai+1+..+Aj|x<=i<=j<=y}.
Input
ThefirstlineofinputcontainsanintegerN.ThefollowinglinecontainsNintegers,representingthesequenceA1..AN.ThethirdlinecontainsanintegerM.ThenextMlinescontaintheoperationsinfollowingform:
0xy:modifyAxintoy(|y|<=10000).
1xy:printmax{Ai+Ai+1+..+Aj|x<=i<=j<=y}.
Output
Foreachquery,printanintegerastheproblemrequired.Example
Input: 4 1234 4 113 03-3 124 133 Output: 6 4 -3
GSS1加个单点修改
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #definem((l+r)>>1) #definelsono<<1,l,m #definersono<<1|1,m+1,r #definelco<<1 #definerco<<1|1 usingnamespacestd; typedeflonglongll; constintN=5e5+5,INF=2e9+5; inlineintread(){ charc=getchar();intx=0,f=1; while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} returnx*f; } intn,q,op,x,y; structnode{ intsum,mx,pre,suf; }t[N<<2]; voidmerge(into){ t[o].sum=t[lc].sum+t[rc].sum; t[o].mx=max(t[lc].suf+t[rc].pre,max(t[lc].mx,t[rc].mx)); t[o].pre=max(t[lc].pre,t[lc].sum+t[rc].pre); t[o].suf=max(t[rc].suf,t[rc].sum+t[lc].suf); } voidbuild(into,intl,intr){ if(l==r)t[o].sum=t[o].mx=t[o].pre=t[o].suf=read(); else{ build(lson); build(rson); merge(o); } } intqpre(into,intl,intr,intql,intqr){ if(ql<=l&&r<=qr)returnt[o].pre; elseif(qr<=m)returnqpre(lson,ql,qr); elsereturnmax(qpre(lson,ql,qr),t[lc].sum+qpre(rson,ql,qr)); } intqsuf(into,intl,intr,intql,intqr){ if(ql<=l&&r<=qr)returnt[o].suf; elseif(m<ql)returnqsuf(rson,ql,qr); elsereturnmax(t[rc].suf,t[rc].sum+qsuf(lson,ql,qr)); } intqmx(into,intl,intr,intql,intqr){ if(ql<=l&&r<=qr)returnt[o].mx; else{ intans=-INF; if(ql<=m)ans=max(ans,qmx(lson,ql,qr)); if(m<qr)ans=max(ans,qmx(rson,ql,qr)); if(ql<=m&&m<qr)ans=max(ans,qsuf(lson,ql,qr)+qpre(rson,ql,qr)); returnans; } } voidupdate(into,intl,intr,intp,intv){ if(l==r)t[o].sum=t[o].mx=t[o].pre=t[o].suf=v; else{ if(p<=m)update(lson,p,v); elseupdate(rson,p,v); merge(o); } } intmain(){ n=read(); build(1,1,n); q=read(); for(inti=1;i<=q;i++){ op=read();x=read();y=read(); if(op)printf("%d\n",qmx(1,1,n,x,y)); elseupdate(1,1,n,x,y); } }
相关文章推荐
- spoj(GSS3) 1716 Can you answer these queries III(线段树求最大子段和)
- SPOJ GSS3 Can you answer these queries III (线段树)
- SPOJ GSS3 Can you answer these queries III ——线段树
- SPOJ 1716 Can you answer these queries III(GSS3 线段树)
- 数据结构(线段树):SPOJ GSS3 - Can you answer these queries III
- [SPOJ GSS3] Can you answer these queries III [线段树]
- SPOJ GSS3 Can you answer these queries III(线段树)
- SPOJ GSS1 - Can you answer these queries I(线段树维护GSS)
- SPOJ 2916 Can you answer these queries V(GSS5 线段树)
- [SPOJ1557][GSS2][线段树]Can you answer these queries II[好题]
- SPOJ GSS1 Can you answer these queries I ——线段树
- SPOJ 1043 Can you answer these queries I(GSS1 线段树)
- spoj 1557 Can you answer these queries II (gss2)线段树
- SPOJ GSS3 Can you answer these queries III
- SPOJ GSS2 Can you answer these queries II ——线段树
- SPOJ GSS3: Can you answer these queries III 题解
- SPOJ GSS1_Can you answer these queries I(线段树区间合并)
- SPOJ GSS2 - Can you answer these queries II(线段树 区间修改+区间查询)(后缀和)
- SPOJ GSS3 Can you answer these queries III
- SPOJ GSS1 Can you answer these queries I (线段树求区间最大连续和)