// 28-1-6: Řešení v amortizovaně konstantním čase #include #define MAXK 1000 int K; // Jak dlouhé je okénko int n; // Kolik hodnot jsme už viděli // Vybraná posloupnost uložená jako cyklické pole: // "r" slouží jako čtecí index, "w" jako zapisovací, // takže využíváme úsek od r do w-1 (modulo MAXK). int pos[MAXK]; // Pozice prvku int val[MAXK]; // Hodnota int r, w; int min; // Aktuální minimum // Přidání prvku do posloupnosti void add(int x) { n++; // Vypadl první prvek? if (r != w && pos[r] <= n-K) r = (r+1) % MAXK; // Odstraňujeme prvky z konce while (r != w && val[(w-1+MAXK) % MAXK] >= x) w = (w-1+MAXK) % MAXK; // Přidáme nový prvek na konec pos[w] = n; val[w] = x; w = (w+1) % MAXK; // Spočítáme minimum okénka min = val[r]; } int main(void) { scanf("%d", &K); int x; while (scanf("%d", &x) == 1) { add(x); if (n >= K) printf("%d\n", min); } return 0; }