O companie de software are angajaţi organizaţi ca o ierarhie în care fiecare are cel mult subalterni direcţi.
Patronul firmei programează de atâta timp, încât pentru el angajaţii nu mai au nume, ci sunt identificaţi prin numere naturale distincte între şi . Este obligatoriu ca firma să facă o listă cu toţi angajaţii. Din motive greu de înţeles lista se face după următoarele reguli:
- Un angajat fără subalterni va face o listă cu un singur element egal cu numărul lui.
- Un angajat cu un singur subaltern direct va face o listă care începe cu numărul lui şi continuă cu lista creată de subalternul lui direct.
- Un angajat cu doi subalterni direcţi va face o listă care începe cu numărul lui şi continuă cu o interclasare oarecare a listelor create de cei doi subalterni direcţi. O interclasare este o listă care conţine toate elementele listelor care se interclasează; în plus dacă două elemente şi se află iniţial în aceeaşi listă, iar este înaintea lui , atunci după interclasare a se va afla în lista finală înaintea lui .
Lista publicată de companie este cea făcută de patronul firmei (angajatul care este în capul ierarhiei). Voi trebuie să aflaţi structura ierarhică a companiei. Pentru că lista publicată nu este de ajuns, aveţi posibilitatea să întrebaţi pentru doi angajaţi care este primul lor şef comun – cel mai “de jos” (cel mai îndepărtat de patron) angajat care îi are pe amândoi ca subalterni (direcţi sau indirecţi). Aveţi un număr limitat de întrebări pe care puteţi să le efectuaţi.
Interacţiune
Programul vostru nu va citi şi nu va scrie nici un fişier. În schimb, va trebui să implementeze funcția
std::vector<int> solve(int N, std::vector<int> list);
unde list reprezentă lista facută de patron, indexată de la cu elemente între și . Programul acum poate pune întrebări pentru a afla primul şef comun a doi angajaţi folosind funcția
int ask(int x, int y);
unde şi sunt numere întregi distincte între şi . Când programul vostru a determinat ierarhia, o va returna ca o listă de elemente, unde al -lea reprezintă şeful direct al angajatului (primul element este mereu ). Dacă este patronul companiei, șeful va fi egal cu .
Exemplu de interacţiune
Comisia apelează solve(5, {3, 4, 5, 2 ,1}).
Implementarea concurentului apelează ask(2, 4) care returnează 3.
Implementarea concurentului apelează ask(1, 5) care returnează 4.
solve returnează {0, 4, 3, 0, 3, 4}.
Restricții și precizări
- Numărul maxim de întrebări pe care le puteţi pune este
- dacă programul nu respectă interacţiunea stabilită, va lua puncte pe testul respectiv
- nu se acordă punctaje parţiale