Zadanie

Inšpektor meškaní: Kde sú vlaky?

Počet bodov: 65

Nitramovi Šullebovi, vedúcemu PR oddelenia nemenovanej železničnej spoločnosti ide o miesto. Práve totiž dovolal s riaditeľom. A ten mu povedal, že ak tento týždeň už konečne nevydá článok, letí!

Nitram však vôbec nevie čo sa deje, týždne ani len nebol v kancelárií. Už začínal byť zúfalý a prezerať pracovné pozície v Lidli, vtom však na to prišiel. Veď použije evergreen vzorec - znižujúce sa meškania vlakov!

No to je síce pekné, ale klesajú vôbec tie meškania? Ktovie, ale to sa jednoducho vyrieši – napíše, že zberná perióda skončila v deň, keď práve klesali (alebo aspoň nerástli). Nemôže si však vybrať akýkoľvek taký deň – keby meškania klesali aj po tomto dni, riaditeľ by videl že vedúci PR si nevie ani len vyfabrikovať najlepšie dáta a to by bol už isto Nitramov koniec.

Nitram vie zistiť priemerné meškanie v akýkoľvek deň jedinou otázkou do databázy. Avšak z kryptických dôvodov má daná tabuľka 1500 stĺpcov1 a tak jediná query trvá hodiny. Kedy bude Nitram nastupovať za pokladňu?

Úloha

V databáze sa nachádzajú informácie o \(n\) dňoch a priemernom meškaní vlakov počas každého z nich. Databázy sa môžete pýtať na meškanie v ľubovoľný deň, avšak môžete položiť najviac \(k\) takýchto otázok. Nájdite deň, kedy meškanie bolo menšie alebo rovné meškaniam v dňoch pred ním a po ňom. Ak má daný deň iba jedného suseda, tiež môže byť odpoveďou, stačí aby spĺňal nerovnosť s existujúcim susedom.

Vstup a Výstup

Prvý riadok vstupu obsahuje číslo \(n (1 \leq n \leq 10^4)\), ktoré označuje počet dní v databáze. Na druhom riadku sa nachádza číslo \(k\) - maximálny počet otázok, ktoré sa môžete databázy spýtať.

Databáze môžete zadávať otázky vypísaním riadku vo formáte ? x, kde \(x\) je číslo dňa, ktorý vás zaujíma. Ako odpoveď testovač vypíše jeden riadok s jedným prirodzeným číslom do \(10^9\) – meškaním v daný deň. Pozície v poli sú indexované číslami od \(1\) do \(n\).

Na vypísanie odpovede vypíšte riadok formátu ! x, kde \(x\) je pozícia lokálneho nestriktného minima. Ak miním existuje viacej, vypíšte ľubovoľné z nich. Ak žiadne neexistuje, vypíšte ! -1.

Keďže táto úloha je interaktívna, po vypísaní každej otázky je nutné flushovať. V pythone sa to robí parametrom print-u flush : print(..., flush = True), v C++ pomocou cin.flush(). Ak tak neurobíte, váš program môže skončiť verdiktom TLE.

Po vypísaní odpovede odpovede musí váš program skončiť. Taktiež musí skončiť, ak na niektorú otázku dostane odpoveď \(-1\), čo indikuje neplatnú otázku (napríklad nedodržaný formát či prekročený počet otázok). Ak tak neurobí, môžete dostať nesprávny verdikt.

Obmedzenia

Úloha má \(5\) sád vstupov. V jednotlivých sadách platia nasledujúce obmedzenia pre \(k\):

Sada 1 2 3 4 5
$ k = $ \(10^4\) \(5000\) \(80\) \(35\) \(28\)

Príklady komunikácie

10000
10000
? 123
234
? 122
234
? 121
572
! 122

Prvok na pozícií 122 je menší alebo rovný obom svojím susedom, je riešením úlohy.

10000
80
? 1
4
? 2
9
! 1

Prvý prvok poľa je menší ako druhý, ktorý je jeho jediným susedom, teda je lokálnym minimom.


  1. https://jimmyhmiller.github.io/ugliest-beautiful-codebase↩︎

Pre odovzdávanie sa musíš prihlásiť.