1 /*
2 题意:n,k<=1e6 给定一个长度为n的数组和大小为k的滑动窗口,求每次的最值
3 思路:单调队列
4 时间:2018.07.17
5 */
6 // #include <bits/stdc++.h>
7 #include <cstdio>
8 #include <iostream>
9 using namespace std;
10
11 typedef long long LL;
12 const int MAXN=1000005;
13 const LL MOD7 = 1e9+7;
14
15 int a[MAXN];
16 int n,K;
17
18 struct Node
19 {
20 int x;
21 int idx;
22 Node(){}
23 Node(int x,int idx):x(x),idx(idx){}
24 }q[MAXN];
25 int head,tail;
26
27 void minQueue()
28 {
29 head=tail=0;
30 for (int i=1;i<min(n,K);++i)
31 {
32 while (head!=tail && a[i]<q[tail-1].x) --tail;
33 q[tail].x=a[i];
34 q[tail++].idx=i;
35 }
36 int flag=0;
37 for (int i=min(n,K);i<=n;++i)
38 {
39 while (head!=tail && q[head].idx+K-1<i) ++head;
40 while (head!=tail && a[i]<q[tail-1].x) --tail;
41 q[tail].x = a[i];
42 q[tail++].idx=i;
43 if (!flag)
44 {
45 printf("%d",q[head].x);
46 flag=1;
47 }
48 else printf(" %d",q[head].x);
49 }
50 printf("\n");
51 }
52
53 void maxQueue()
54 {
55 head=tail=0;
56 for (int i=1;i<min(n,K);++i)
57 {
58 while (head!=tail && q[tail-1].x<a[i]) --tail;
59 q[tail].x=a[i];
60 q[tail++].idx=i;
61 }
62 int flag=0;
63 for (int i=min(n,K);i<=n;++i)
64 {
65 while (head!=tail && q[head].idx+K-1<i) ++head;
66 while (head!=tail && q[tail-1].x<a[i]) --tail;
67 q[tail].x=a[i];
68 q[tail++].idx=i;
69 if (!flag)
70 {
71 printf("%d",q[head].x);
72 flag=1;
73 } else {
74 printf(" %d",q[head].x);
75 }
76 }
77 printf("\n");
78 }
79
80 int main()
81 {
82 #ifndef ONLINE_JUDGE
83 freopen("test.txt","r",stdin);
84 #endif // ONLINE_JUDGE
85 // while (scanf("%d%d",&n,&K)!=-1)
86 scanf("%d%d",&n,&K);
87 {
88 for (int i=1;i<=n;++i) scanf("%d",&a[i]);
89 minQueue();
90 maxQueue();
91 }
92 return 0;
93 }