flareon

Time limit: 1.15s Memory limit: 512MB Input: flareon.in Output: flareon.out

Orașul Alexandria a fost luat cu asalt de grupuri de durants, pokemoni furnică! Aceștia și-au construit NN mușuroaie numerotate de la 11 la NN, conectate între ele prin N1N - 1 tuneluri bidirecționale, astfel încât să se poată ajunge dintr-un mușuroi în oricare altul urmând tunelurile. Definim distanța d(i,j)d(i,j) ca fiind egală cu numărul minim de tuneluri care trebuie traversate pentru a ajunge din mușuroiul ii în mușuroiul jj.

Candela, liderul echipei Valor, a convocat MM flareoni, al ii-lea dintre aceștia fiind staționat lângă mușuroiul Pos[i]Pos[i] și având o mișcare Lava Plume de putere Power[i]Power[i]. Un atac de tip Lava Plume de putere pp efectuat la mușuroiul ii, adaugă la gradul de distrugere Dmg[j]Dmg[j] al mușuroiului jj valoarea max(0,pd(i,j))max(0, p - d(i, j)).

Se cere să se determine, pentru fiecare mușuroi ii, gradul de distrugere Dmg[i]Dmg[i] al acestuia după atacurile tuturor celor MM flareoni.

Implementare

Programul vostru va conține o funcție:

void solve(int N, int M, int* V, int* Pos, int* Power);

Parametrii NN, respectiv MM reprezintă numărul de mușuroaie, respectiv numărul de flareoni. Parametrul VV este un array de lungime N1N - 1, indexat de la 0, elementul de pe poziția ii al acestuia reprezentând existența unui tunel între mușuroaiele i+2i + 2 și V[i]V[i]. Parametrii PosPos și PowerPower sunt două array-uri de dimensiune MM, indexate de la 0, cu semnificația că al ii-lea flareon se află la poziția Pos[i]Pos[i], și are o mișcare Lava Plume de putere Power[i]Power[i].

Odată ce ați găsit cele NN grade de distrugere, trebuie să apelați funcția, implementată de grader:

void answer(long long* Dmg);

Când apelați această funcție trebuie sa transmiteți parametrul DmgDmg, un array de lungime NN indexat de la 00, al ii-lea element al acestuia reprezentând gradul de distrugere al mușuroiului i+1i+1.

Pe lângă funcția pe care o 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 flareon.h. Programul main.cpp citește din fișierul de intrare flareon.in, apelează funcția solve a concurentului și afișează array-ul DmgDmg dat ca parametru prin funcția answer în fișierul flareon.out.

Pe prima linie a fișierului flareon.in se află numerele naturale NN și MM. Pe a doua linie se află N1N - 1 numere naturale, reprezentând elementele array-ului VV. Pe următoarele MM linii se află MM perechi de întregi, a ii-a pereche reprezentând numerele Pos[i]Pos[i] și Power[i]Power[i].
În fișierul de ieșire flareon.out vor fi afișate NN numere naturale, al ii-ulea dintre acestea reprezentând numărul Dmg[i]Dmg[i].

Restricții și precizări

  • 1N200 0001 ≤ N ≤ 200 \ 000
  • 1M500 0001 ≤ M ≤ 500 \ 000
  • Pentru 20% din teste, N1 000N ≤ 1 \ 000 și M2 000M ≤ 2 \ 000
  • Pentru 70% din teste, N30 000N ≤ 30 \ 000 și M30 000M ≤ 30 \ 000
  • Lângă un mușuroi se pot afla mai mulți flareoni.

Exemplu

flareon.in

4 3
1 1 3
2 2
3 2
4 10

flareon.out

10
9
11
11

Explicație

Funcția solve va primi parametrii: N=4N = 4, M=3M = 3, T={1,1,3}T = \{1, 1, 3\}, Pos={2,3,4}\text{Pos} = \{2, 3, 4\}, Power={2,2,10}\text{Power} = \{2, 2, 10\}.
Drumurile directe între mușuroaie sunt (2,1),(3,1),(4,2)(2, 1), (3, 1), (4, 2).

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