http://poj.org/problem?id=2823
#include <iostream>
#include <cstdio>
using namespace std;
const int NM=1000005;
int a[NM],que[NM];
int n,len;
void Min_win()
{
int tail,head,i;
head=1;
tail=0;
for(i=1;i<=len;i++)
{
while(tail>=head&&a[que[tail]]>a[i])
tail--;
tail++;
que[tail]=i;
}
for(i=len;i<=n;i++)
{
while(tail>=head&&a[que[tail]]>a[i])
tail--;
tail++;
que[tail]=i;
while(que[head]<i-len+1)
head++;
printf("%d",a[que[head]]);
if(i<=n) printf(" ");
}
}
void Max_win()
{
int tail,head,i;
tail=0;
head=1;
for(i=1;i<=len;i++)
{
while(head<=tail&&a[que[tail]]<a[i])
tail--;
tail++;
que[tail]=i;
}
for(i=len;i<=n;i++)
{
while(head<=tail&&a[que[tail]]<a[i])
tail--;
tail++;
que[tail]=i;
while(que[head]<i-len+1)
head++;
printf("%d",a[que[head]]);
if(i<=n) printf(" ");
}
}
int main()
{
int i;
while(scanf("%d%d",&n,&len)!=EOF)
{
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
Min_win();
printf("\n");
Max_win();
printf("\n");
}
return 0;
}