#include <cstdio>#include<algorithm>#defineMAXN 1000005#defineINF 0x3f3f3f3fusing namespacestd;intsegtree_min[maxn<<2],segtree_max[maxn<<2];intN,k,value;intBegin,end;//Each node holds the maximum/small value of the interval segmentvoidBuild (intLintRintPOS) { if(l==R) {scanf ("%d",&value); Segtree_max[pos]=segtree_min[pos]=value; return ; } intMid= (L+R)/2; Build (L,mid,2*POS); Build (Mid+1R2*pos+1); Segtree_min[pos]=min (segtree_min[2*pos],segtree_min[2*pos+1]); Segtree_max[pos]=max (segtree_max[2*pos],segtree_max[2*pos+1]);}intQuery_min (intllintRrintLintRintPOS) { if(ll<=l&&r<=RR)returnSegtree_min[pos]; intMid= (L+R)/2; //int begin=inf,end=inf; if(ll<=mid) Begin=query_min (Ll,rr,l,mid,2*POS); if(rr>mid) End=query_min (ll,rr,mid+1R2*pos+1); returnmin (begin,end);}intQuery_max (intllintRrintLintRintPOS) { if(ll<=l&&r<=RR)returnSegtree_max[pos]; intMid= (L+R)/2; //int begin=-inf,end=-inf; if(ll<=mid) Begin=query_max (Ll,rr,l,mid,2*POS); if(rr>mid) End=query_max (ll,rr,mid+1R2*pos+1); returnMax (begin,end);}intMain () {scanf ("%d%d",&n,&k); Build (1N1); for(intI=1; i<=n-k+1; i++) printf ("%d", Query_min (i,i+k-1,1N1)); printf ("\ n"); for(intI=1; i<=n-k+1; i++) printf ("%d", Query_max (i,i+k-1,1N1)); printf ("\ n");}
PKU 2823 Sliding Window (line segment Tree | | rmq| | Monotone queue)