turneu

Time limit: 0.45s Memory limit: 40MB Input: turneu.in Output: turneu.out

Se consideră un număr întreg pozitiv KK şi N=2KN = 2^K. La un turneu participă NN concurenţi numerotaţi de la 00 la N1N-1. Pentru fiecare concurent ii este cunoscută puterea acestuia pip_i. Puterile sunt numere întregi pozitive distincte şi strict mai mici decât NN. Cu alte cuvinte şirul pp este o permutare a numerelor întregi de la 00 la N1N-1. Un meci între doi concurenţi este câştigat de jucătorul care are putere mai mare.

În primul tur al turneului se desfăşoară meciuri după cum urmează: primul meci este între concurenţii 00 şi 11, al doilea meci între concurenţii 22 şi 33, ş.a.m.d , al mm-lea meci este între concurenţii 2m22 \cdot m-2 şi 2m12 \cdot m-1. Ultimul meci din primul tur va fi între jucătorii N2N-2 şi N1N-1.

Începând cu al doilea tur meciurile se vor desfăşura astfel: primul meci va fi între câştigătorii din primele două meciuri din turul anterior, al doilea meci între câştigătorii următoarelor două meciuri, ş.a.m.d. astfel că ultimul meci va fi între câştigătorii ultimelor două meciuri din turul anterior. Turneul va continua până va fi desemnat câştigătorul turneului.

Cerință

Să ne imaginăm următorul scenariu: sunteţi concurentul cu puterea xx şi aţi vrea să câştigaţi cât mai multe meciuri în turneu. Pentru a atinge acest scop aveţi dreptul să faceţi un număr de cel mult yy intershimbări între participanţii la turneu. La o interschimbare poziţiile celor doi jucători în tabloul iniţial al meciurilor din primul tur se schimbă între ele.

După efectuarea a cel mult yy interschimbări turneul începe şi se supune regulilor descrise mai sus, dar datorită modificărilor este posibil ca la unele dintre meciuri câştigătorii să fie diferiţi.

În această problemă va trebui să implementaţi două funcţii.

void init (int N, int *p)

Această funcţie va fi apelată de graderul comisiei o singură dată. Acest apel va trimite prin intermediul parametrului NN valoarea cu semnificaţia din enunţ iar prin intermediul parametrului pp adresa de început a unui vector de numere întregi conţinând puterile celor NN concurenţi.

int query (int x, int y)

Această funcţie va fi apelată de mai multe ori în graderul comisiei după unicul apel al funcţiei init. Funcţia va trebui să rezolve un scenariu de tipul celui descris mai sus. Prin intermediul parametrului xx funcţia primeşte puterea unui concurent şi prin intermediul parametrului yy un număr maxim de interschimbări permise şi trebuie să returneze numărul maxim de meciuri pe care l-ar putea câştiga jucătorul cu puterea xx dacă face într-un mod convenabil cel mult yy interschimbări în tabloul iniţial.

ATENŢIE: Un jucător poate fi schimbat cu oricare alt jucător – inclusiv jucătorul cu puterea xx.

Restricții și precizări

  • 2K202 \leq K \leq 20
  • 0x,yN10 \leq x, y \leq N-1 pentru fiecare apel al funcţiei query
  • funcţia query va fi apelată de graderul comisiei de cel mult 5×1055\times 10^5 ori.
  • Pentru 1515 puncte K10K \leq 10, numărul apelurilor a functiei query 1 000\leq 1 \ 000
  • Pentru alte 2020 de puncte K17K \leq 17, valorile xx ale query-urilor sunt date în ordine crescătoare
  • Pentru alte 1010 puncte K=18K = 18
  • Pentru alte 1010 puncte K=19K = 19
  • Pentru restul de 4545 de puncte K=20K = 20
  • Pointerul primit în funcția init poate fi folosit în orice fel (inclusiv modificată memoria)

Exemplu

Actiune grader

init( 4,{3,2,0,1}) 
query (1,0)
query (0,2)
query (3,1)
query (2,2)

Efect

1
0
2
1

Explicatie

La turneu participă 44 jucători: Jucătorul 00 are putere 33, Jucătorul 11 are putere 22, Jucătorul 22 are putere 00, Jucătorul 33 are putere 11.

Pentru primul query, nu este permisă nicio interschimbare. În primul tur jucătorul cu puterea 11 câştigă meciul împotriva jucătorului cu puterea 00. În al doilea tur jucătorul cu puterea 11 pierde în faţa jucătorului cu puterea 33.

Pentru cel de-al doilea query, sunt permise 22 interschimbări. Indiferent de numărul de interschimbări efectuate jucătorul cu puterea 00 va pierde din primul tur deoarece are cea mai mică putere din tot turneul.

Pentru cel de-al treilea query, o singură interschimbare este permisă. Indiferent de numărul de interschimbări jucătorul cu puterea 33 va câştiga orice meci deoarece are cea mai mare putere. Astfel după ce câştigă primul meci cu unul dintre adversari, va câştiga meciul cu câştigătorul meciului dintre ceilalţi doi devenind astfel şi câştigătorul turneului.

Exemplul 2

Actiune grader

init( 8,{2,7,3,0,1,4,6,5})
query (3,1) 
query (3,0)
query (1,5)
query (4,7)
query (7,7)

Efect

2
1
1
2
3

Log in or sign up to be able to send submissions!