Mickey și Minnie au ajuns în fața unui perete pe care erau desenate N cercuri și mai multe săgeți, fiecare săgeată pornind dintr-un cerc și ajungând la un alt cerc. Desenul era foarte complicat, dar Minnie l-a întrebat pe Mickey dacă există vreun cerc în care intră săgeți de care pornesc de la toate celelalte cercuri, dar din care nu pleacă nici o săgeată. Pentru a o impresiona pe Minnie, Mickey a spus că va studia problema, dar se pare că nu se prea descurcă, motiv pentru care vă cere ajutorul. Din nefericire, nu puteți comunica decât prin intermediul unui telefon. Mickey vă spune la început numărul N al cercurilor, dar nu are răbdare să vă descrie toate săgețile. Datorită nerăbdării lui Mickey, îl veți putea întreba doar de 2 * N ori dacă există o săgeată care pleacă de la un anumit cerc și ajunge la un anumit cerc. Din fericire, ați auzit-o la telefon pe Minnie strigând "L-am găsit", motiv pentru care știți cu siguranță că există un astfel de cerc.
Pentru a simula discuția cu Mickey aveți la dispoziție o bibliotecă externă numită ARROWS.PAS (pentru programatorii în Pascal) sau ARROWS.H (pentru programatorii în C/C++). Bibliteca vă pune la dispoziție rutine pentru:
Pentru a putea folosi biblioteca va trebui să includeți în programul dumneavoastră istrucțiunea uses arrows; pentru limbajul Pascal și #include "arrows.h" pentru limbajul C/C++. În continuare sunt prezentate sintaxele funcțiilor și procedurilor incluse în biblioteci:
procedure Init; void Init() - trebuie apelată la începutul programului și este folosită de către bibliotecă pentru inițializare; - întrerupe execuția programului dacă este apelată a doua oară. function GetN:Integer; int GetN() - returnează numărul de cercuri de pe perete (N). function IsArrow(i,j:Integer):Boolean; int IsArrow(int i,int j) - returnează true (valoare nenulă) dacă există o săgeată de la cercul i la cercul j și false (0) în caz contrar; - întrerupe execuția programului dacă cel puțin una dintre valorile i și j nu este un număr întreg cuprins între 1 și N sau dacă numărul de apeluri ale acestei funcții depășește numărul maxim permis. procedure Result(circle:Integer); int Result(int circle) - acceptă ca rezultat faptul că circle este numărul de ordine al cercului căutat; - validează rezultatul; - întrerupe execuția programului. Toate funcțiile și procedurile (excepție: Init) întrerup execuția programului dacă sunt apelate înaintea inițializării. Programul vostru nu va citi datele din nici un fișier de intrare și nu va scrie date în nici un fișier de ieșire.
2 <= N <= 100;
Subprogram apelat Valoare returnată
cercurile sunt identificate prin numere cuprinse între 1 și N. Init - GetN 3 IsArrow(1,2) true (1) IsArrow(1,3) true (1) IsArrow(2,3) true (1) IsArrow(3,1) false (0) IsArrow(2,1) true (1) IsArrow(3,2) false (0) Result(3) - |