Blanche, liderul echipei Mystic, a fost capturată de echipa Lacheta! Ea a fost adusă într-o bază a echipei care conține obstacole numerotate de la la , fiecare obstacol având rezistența . Inițial, Blanche este plasată în dreptul celui de-al -lea obstacol. Încercând să scape, ea îl eliberează pe Vaporeon care distruge al -lea obstacol și capătă puterea de atac egală cu .
Pentru a evada, Vaporeon trebuie să distrugă toate obstacolele rămase. La un moment de timp la care Vaporeon a distrus toate obstacolele din intervalul , el poate executa exact una din mișcările:
- Hydro Pump pe obstacolul , dacă și .
- Hydro Pump pe obstacolul , dacă și .
- Work Up, care crește puterea de atac la valoarea minimă dintre și .
Dacă doar unul din obstacole există, puterea de atac crește la valoarea rezistenței acestuia.
O mișcare Hydro Pump necesită efort , în timp ce o mișcare Work Up necesită efort . Notăm cu efortul necesar evadării pornind din al -lea obstacol. este egal cu suma minimă a eforturilor necesare pentru a distruge cele obstacole, dacă Vaporeon a început din al -lea obstacol.
Echipa Lacheta a anticipat această strategie, așa că studiază diferite aranjamente ale obstacolelor, cât și diferite poziții în care să o plaseze inițial pe Blanche. Ei vă vor da numărul de obstacole , efortul necesar unei mișcări și rezistențele celor obstacole. Apoi, ei vă vor cere să efectuați următoarele operații:
- Să schimbați două obstacole adiacente și .
- Să spuneți, pentru doi indici și , care este suma pentru aranjamentul actual al obstacolelor.
Implementare
Programul vostru va trebui să implementeze următoarele funcții:
int initialize(int N, int K, int* R);
Această funcție este apelată o singură dată la începutul executării programului. Parametrii , respectiv reprezintă numărul de obstacole, respectiv efortul necesar pentru o mișcare Work Up. Parametrul este un array de lungime , indexat de la 0 , elementul de pe poziția al acestuia reprezentând rezistența obstacolului .
void exchange(int x);
Această funcție este apelată pentru fiecare interschimbare de obstacole efectuată. Parametrul reprezintă faptul că se interschimbă obstacolele de pe pozițiile și .
long long query(int x, int y);
Această funcție este apelată de mai multe ori, o dată pentru fiecare întrebare a echipei Lacheta. Primind parametrii și , trebuie să returnați suma pentru aranjamentul actual al obstacolelor.
Pe lângă funcțiile pe care le veți implementa, puteți declara variabile locale sau globale și puteți implementa alte funcții ajutătoare. Se recomandă ca variabilele globale și funcțiile să fie declarate cu modificatorul static
.
Testare
Pentru a vă testa local soluțiile, vă oferim programul main.cpp
și header-ul vaporeon.h
. Programul main.cpp
citește din fișierul de intrare vaporeon.in
, apelează funcțiile initialize
, exchange
și query
ale concurentului și afișează răspunsul returnat de fiecare apel la funcția query.
Pe prima linie a fișierului vaporeon.in
se află numerele naturale și . Pe a doua linie se află numere naturale, reprezentând elementele array-ului . Pe următoarele linii se află descrise operațiile:
1 x
, dacă avem un apelexchange(x)
2 x y
, dacă avem un apelquery(x, y)
Pe fiecare linie a fișierului vaporeon.out
se află, în ordine, răspunsurile returnate de funcția query
.
Restricții și precizări
- Numărul total de apeluri la funcțiile
exchange
șiquery
nu depășește . - Pentru
20%
din teste, și numărul total de apeluri la funcțiileexchange
șiquery
nu depășește .
Exemplu
vaporeon.in
5 3
2 3 1 4 1
2 2 2
2 1 5
1 2
2 2 2
2 1 5
vaporeon.out
7
38
13
41
Explicație
Apelurile efectuate sunt:
initialize(5, 3, {2,3,1,4,1})
query(2, 2)
- returnează
query(1, 5)
- returnează
exchange(2)
query(2, 2)
- returnează
query(1, 5)
- returnează
Pentru primul query, Vaporeon pleacă din obstacolul de pe poziția cu puterea . El execută:
Hydro Pump
Hydro Pump
Work Up (capătă puterea )
Hydro Pump
Hydro Pump
După operația de exchange
, obstacolele au configurația
Pentru al treilea query, Vaporeon pleacă din obstacolul de pe poziția cu puterea . El execută:
Work Up (capătă puterea ) .
Hydro Pump
Work Up (capătă puterea )
Hydro Pump
Work Up (capătă puterea )
Hydro Pump
Hydro Pump