vaporeon

Time limit: 0.55s Memory limit: 512MB Input: vaporeon.in Output: vaporeon.out

Blanche, liderul echipei Mystic, a fost capturată de echipa Lacheta! Ea a fost adusă într-o bază a echipei care conține NN obstacole numerotate de la 11 la NN, fiecare obstacol ii având rezistența R[i]R[i]. Inițial, Blanche este plasată în dreptul celui de-al xx-lea obstacol. Încercând să scape, ea îl eliberează pe Vaporeon care distruge al xx-lea obstacol și capătă puterea de atac AA egală cu R[x]R[x].

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 [x,y][x, y], el poate executa exact una din mișcările:

  1. Hydro Pump pe obstacolul x1x-1 , dacă x11x-1 ≥ 1 și R[x1]AR[x-1] ≤ A.
  2. Hydro Pump pe obstacolul y+1y+1 , dacă y+1Ny+1 ≤ N și R[y+1]AR[y+1] ≤ A.
  3. Work Up, care crește puterea de atac AA la valoarea minimă dintre R[x1]R[x-1] și R[y+1]R[y+1].
    Dacă doar unul din obstacole există, puterea de atac crește la valoarea rezistenței acestuia.

O mișcare Hydro Pump necesită efort 11, în timp ce o mișcare Work Up necesită efort KK. Notăm cu E[x]E[x] efortul necesar evadării pornind din al xx-lea obstacol. E[x]E[x] este egal cu suma minimă a eforturilor necesare pentru a distruge cele NN obstacole, dacă Vaporeon a început din al xx-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 NN, efortul KK necesar unei mișcări și rezistențele celor NN obstacole. Apoi, ei vă vor cere să efectuați următoarele operații:

  1. Să schimbați două obstacole adiacente xx și x+1x + 1 .
  2. Să spuneți, pentru doi indici xx și yy, care este suma E[x]+E[x+1]+...+E[y]E[x] + E[x+1] + ... + E[y] 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 NN, respectiv KK reprezintă numărul de obstacole, respectiv efortul necesar pentru o mișcare Work Up. Parametrul RR este un array de lungime NN, indexat de la 0 , elementul de pe poziția ii al acestuia reprezentând rezistența obstacolului i+1i + 1.

void exchange(int x);

Această funcție este apelată pentru fiecare interschimbare de obstacole efectuată. Parametrul xx reprezintă faptul că se interschimbă obstacolele de pe pozițiile xx și x+1x + 1.

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 xx și yy, trebuie să returnați suma E[x]+E[x+1]+...+E[y]E[x] + E[x+1] + ... + E[y] 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 NN și KK. Pe a doua linie se află NN numere naturale, reprezentând elementele array-ului RR. Pe următoarele linii se află descrise operațiile:

  • 1 x, dacă avem un apel exchange(x)
  • 2 x y, dacă avem un apel query(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

  • 1N100 0001 ≤ N ≤ 100 \ 000
  • 1K1 000 0001 ≤ K ≤ 1 \ 000 \ 000
  • 1R[i]1 000 000 0001 ≤ R[i] ≤ 1 \ 000 \ 000 \ 000
  • Numărul total de apeluri la funcțiile exchange și query nu depășește 200 000200 \ 000.
  • Pentru 20% din teste, N1 000N ≤ 1 \ 000 și numărul total de apeluri la funcțiile exchange și query nu depășește 2 0002 \ 000.

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ă 77
query(1, 5) - returnează 3838
exchange(2)
query(2, 2) - returnează 1313
query(1, 5) - returnează 4141

Pentru primul query, Vaporeon pleacă din obstacolul de pe poziția 22 cu puterea 33. El execută:
Hydro Pump 11
Hydro Pump 33
Work Up (capătă puterea 44)
Hydro Pump 44
Hydro Pump 55

După operația de exchange, obstacolele au configurația {2,1,3,4,1}\{2, 1, 3, 4, 1\}

Pentru al treilea query, Vaporeon pleacă din obstacolul de pe poziția 22 cu puterea 11. El execută:
Work Up (capătă puterea 22) .
Hydro Pump 11
Work Up (capătă puterea 33)
Hydro Pump 33
Work Up (capătă puterea 44)
Hydro Pump 44
Hydro Pump 55

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