单调队列的模板题了~
#include<cstdio>
#define MAXN 10000005
using namespace std;
struct queue{
int q[MAXN];
int l,r;
}q,d;
int N,M;
int main(){
scanf("%d%d",&N,&M);
for(register int i=1;i<=N;++i)scanf("%d",&q.q[i]);
q.l=1;q.r=0;
d.l=1;d.r=0;
for(register int i=1;i<=M;++i){
int x = q.q[i];
while(d.l<=d.r&&d.q[d.r]>x)d.r--;
d.q[++d.r] = x;
}
for(register int i=M+1;i<=N;++i){
printf("%d ",d.q[d.l]);
if(q.q[q.l]==d.q[d.l])d.l++;
q.l++;
int x = q.q[i];
while(d.l<=d.r&&d.q[d.r]>x)d.r--;
d.q[++d.r] = x;
}
printf("%d ",d.q[d.l]);
puts("");
q.l=1;q.r=0;
d.l=1;d.r=0;
for(register int i=1;i<=M;++i){
int x = q.q[i];
while(d.l<=d.r&&d.q[d.r]<x)d.r--;
d.q[++d.r] = x;
}
for(register int i=M+1;i<=N;++i){
printf("%d ",d.q[d.l]);
if(q.q[q.l]==d.q[d.l])d.l++;
q.l++;
int x = q.q[i];
while(d.l<=d.r&&d.q[d.r]<x)d.r--;
d.q[++d.r] = x;
}
printf("%d ",d.q[d.l]);
return 0;
}