简单优先队列
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <vector>
using namespace std;
#define maxn 1100000
int q[maxn],h,t;
int n,m,k,save[maxn],num[maxn];
vector<int>ans;
void great()
{
h=1;
t=0;
for(int i=1;i<k;i++)
{
while(h<=t&&q[t]<=save[i]) t--;
t++;
q[t]=save[i];num[t]=i;
}
for(int i=k;i<=n;i++)
{
while(h<=t&&q[t]<=save[i]) t--;
t++;
q[t]=save[i];num[t]=i;
while(num[h]<=i-k)h++;
printf("%d ",q[h]);
}
}
void small()
{
h=1;
t=0;
for(int i=1;i<k;i++)
{
while(h<=t&&q[t]>=save[i]) t--;
t++;
q[t]=save[i];num[t]=i;
}
for(int i=k;i<=n;i++)
{
while(h<=t&&q[t]>=save[i]) t--;
t++;
q[t]=save[i];num[t]=i;
while(num[h]<=i-k)h++;
printf("%d ",q[h]);
}
}
int main()
{
scanf("%d%d",&n,&k);
{
for(int i=1;i<=n;i++)
{
scanf("%d",&save[i]);
}
small();
printf("\n");
great();
}
return 0;
}