单调队列
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int inf=100000000;
const int maxn=1000006;
int N,k,a[maxn];
struct Q
{
int d,u;
}q[maxn];
void getmax()
{
int f=1,r=0;
q[0].d=inf;
for(int i=1;i<=N;i++)
{
while(a[i]>=q[r].d && r>=f) r--;
r++;q[r].d=a[i];q[r].u=i;
if(i>=k)
{
int li=i-k+1;
while(q[f].u<li) f++;
printf("%d ",q[f].d);
}
}
}
void getmin()
{
int f=1,r=0;
q[0].d=-inf;
for(int i=1;i<=N;i++)
{
while(a[i]<=q[r].d && r>=f) r--;
r++;q[r].d=a[i];q[r].u=i;
if(i>=k)
{
int li=i-k+1;
while(q[f].u<li) f++;
printf("%d ",q[f].d);
}
}
}
int main()
{
// freopen("test.txt","r",stdin);
scanf("%d%d",&N,&k);
for(int i=1;i<=N;i++)
scanf("%d",&a[i]);
getmin();
printf("\n");
getmax();
printf("\n");
return 0;
}