1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
void build(int x,int l,int r){ if(l==r) f[x]=a[l]; else{ int mid=(l+r)/2; build(x*2,l,mid); build(x*2+1,mid+1,r); f[x]=max(f[x*2],f[x*2+1]); } }
void modify(int x,int l,int r,int pos,int d){ if(l==r) f[x]+=d; else{ int mid=(l+r)/2; if(pos<=mid) modify(x*2,l,mid,pos,d); else modify(x*2+1,mid+1,r,pos,d); f[x]=max(f[x*2],f[x*2+1]); } }
int query(int x,int l,int r,int ql,int qr){ if(ql<=l&&r<=qr) return f[x]; else{ int mid=(l+r)/2; int s=INT_MIN; if(ql<=mid) s=max(s,query(x*2,l,mid,ql,qr)); if(mid+1<=qr) s=max(s,query(x*2+1,mid+1,r,ql,qr)); return s; } }
|