#include #define MAX_N 1000 #define MAX_K 10 int q[MAX_K], qb, qe; // quack for window data void queueInit() { qb = qe = 0; } int queueEmpty() { return qb == qe; } int queueFirst() { return q[qb]; } int queueLast() { return qe ? q[qe - 1] : q[MAX_K - 1]; } void queueAddLast(int x) { q[qe++] = x; if (qe == MAX_K) { qe = 0; } } void queueRemoveLast() { qe--; if (qe < 0) { qe = MAX_K - 1; } } void queueRemoveFirst() { if (++qb == MAX_K) { qb = 0; } } int main(void) { int v[MAX_N], n, k; // problem input FILE *f = fopen("msw.in", "r"); fscanf(f, "%d %d", &n, &k); for (int i = 0; i < n; i++) { fscanf(f, "%d", &v[i]); } fclose(f); queueInit(); for (int i = 0; i < n; i++) { if (i == queueFirst() + k) { queueRemoveFirst(); } while (!queueEmpty() && v[queueLast()] >= v[i]) { queueRemoveLast(); } queueAddLast(i); printf("%d ", v[queueFirst()]); } printf("\n"); }