Fie o permutare de lungime . Considerăm operația de interschimbare de valori aflate pe două poziții consecutive.
Definim o permutare de lungime ca fiind un șir care conține toate numerele de la la exact odată. Fie o permutare și un indice . În urma interschimbării valorilor aflate pe pozițiile și din , permutarea devine .
Concurentul (adică tu) poate cumpăra astfel de interschimbări. Odată cumpărată, o interschimbare poate fi folosită de oricâte ori. Definim costul lui ca fiind numărul minim de astfel de interschimbări ce trebuie cumpărate astfel încât permutarea să poată fi sortată folosind doar interschimbările cumpărate, fiecare de oricâte ori.
Comisia (adică noi) schimbă de ori permutarea prin interschimbarea valorilor de pe două poziții arbitrare, nu neapărat adiacente. Odată făcută o schimbare asupra permutării, ea rămâne valabilă în continuare.
Atât pentru permutarea inițială, cât și pentru permutările obținute după fiecare dintre schimbările comisiei, se cere costul lui .
Protocol de interacțiune
Concurentul va implementa două funcții init
și query
, cu următoarele semnături:
int init (std::vector<int> p);
int query (int x, int y);
Funcția init
:
- Va fi apelată o singura dată, la începutul fiecărui test.
- Primește permutarea inițială , de lungime .
- Trebuie să întoarcă o singură valoare, reprezentand costul permutarii .
Funcțiaquery
: - Va fi apelată de mai multe ori ( ori) pe parcursul unui test.
- Primește interschimbarea facută de comisie . Este posibil că .
- Trebuie să întoarcă o singură valoare, reprezentand costul permutarii dupa aplicarea schimbării.
Concurentul NU va implementa o funcție main
.
Subtask 1 (6 puncte)
Subtask 2 (13 puncte)
Subtask 3 (46 puncte)
Subtask 4 (22 puncte)
- Schimbările făcute de comisie interschimbă doar valori de pe poziții adiacente. Mai exact, pentru toate schimbarile comisiei.
Subtask 5 (13 puncte)
Exemple
Input
3 4
0 1 2
0 1
0 1
0 2
1 2
Output
0
1
0
2
2
Input
4 6
0 3 2 1
1 2
1 3
0 2
0 1
1 2
0 2
Output
2
2
1
3
3
2
3
Explicații
Pentru primul exemplu:
În permutarea inițială, , nu este nevoie de nicio interschimbare pentru a sorta permutarea.
În permutarea de după prima schimbare, , este nevoie de cumpărarea interschimbarii .
Permutarea de după a doua schimbare este indentică cu cea inițială.
Penultima permutare este și este nevoie de cumpărarea transpozițiilor și .
Ultima permutare este , iar interschimbarile și rămân ambele necesare (chiar dacă sunt folosite de mai multe ori, fiecare este cumpărată doar o dată).