/* poj 2823 线段树 通用解法 没什么讲的*/#include<stdio.h>#include<string.h>const int N=1000011; struct node{ int l,r,min,max; }tree[3*N];int mmi[N],mma[N];int a[N];int k,n;int max(int x,int y){ if(x>y) return x; return y; } int min(int x,int y){ if(x<y) return x; return y; }void build(int l,int r,int root){ tree[root].l=l; tree[root].r=r; if(l==r) { tree[root].min=tree[root].max=a[l]; return ; } int mid=(l+r)>>1; build(l,mid,root*2); build(mid+1,r,root*2+1); tree[root].min=min(tree[2*root].min,tree[2*root+1].min); tree[root].max=max(tree[2*root].max,tree[2*root+1].max); }void query(int l,int r,int &mmin,int &mmax,int root){ if(l==tree[root].l && r==tree[root].r) { mmin=tree[root].min; mmax=tree[root].max; return ; } int mid=(tree[root].l+tree[root].r)>>1; if(mid>=r) { query(l,r,mmin,mmax,2*root); } else if(mid<l) { query(l,r,mmin,mmax,2*root+1); } else { int max2,min2; query(l,mid,mmin,mmax,2*root); query(mid+1,r,min2,max2,2*root+1); mmin=min(mmin,min2); mmax=max(mmax,max2); } }void solve(){ int mmin,mmax; for(int i=1;i<=n-k+1;i++) { query(i,i+k-1,mmin,mmax,1); mmi[i]= mmin; mma[i]= mmax; } for(int i=1;i<=n-k+1;i++) printf("%d ",mmi[i]); printf("\n"); for(int i=1;i<=n-k+1;i++) printf("%d ",mma[i]); printf("\n");}int main(){ while(scanf("%d%d",&n,&k)!=EOF) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); build(1,n,1); solve(); } return 0; }