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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| struct segment_tree{ #define ls (p<<1) #define rs (p<<1|1) int n; struct node{ int mx,mi; }tr[maxn<<3]; void push_up(int p){ tr[p]=node(max(tr[ls].mx,tr[rs].mx),min(tr[ls].mi,tr[rs].mi)); return; } void build(int p,int l,int r){ if(l==r){ cin>>tr[p].mx; tr[p].mi=tr[p].mx; return; } int mid=(l+r)>>1; build(ls,l,mid); build(rs,mid+1,r); push_up(p); } void build(int _n){ n=_n; build(1,1,n); } void print(int p=1,int l=1,int r=n){ printf("%2d[%d,%d] %d %d \n",p,l,r,tr[p].mx,tr[p].mi); if(l==r){ return; } int mid=(l+r)>>1; print(ls,l,mid); print(rs,mid+1,r); } void erase(int p,int l,int r,int id){ if(l==r){ tr[p].mx=-inf; tr[p].mi=inf; return; } int mid=(l+r)>>1; if(id<=mid)erase(ls,l,mid,id); else erase(rs,mid+1,r,id); push_up(p); } int qmx(int p,int l,int r,int L,int R){ if(l<=L && R<=r){ return tr[p].mx; } int mid=(l+r)>>1,ans=-inf; if(L<=mid)ans=max(ans,qmx(ls,l,mid,L,R)); if(mid+1<=R)ans=max(ans,qmx(rs,mid+1,r,L,R)); return ans; } int qmi(int p,int l,int r,int L,int R){ if(l<=L && R<=r){ return tr[p].mi; } int mid=(l+r)>>1,ans=inf; if(L<=mid)ans=min(ans,qmi(ls,l,mid,L,R)); if(mid+1<=R)ans=min(ans,qmi(rs,mid+1,r,L,R)); return ans; } #undef ls #undef rs }tr;
|