Напомена: ово је незванична копија задатака. Као таква, не гарантује се да ће овај сајт бити одржаван, и немојте се изненадити ако са њега задаци одједном нестану.

У току је планирање прве фазе београдског метроа, која ради једноставности вози искључиво са југа на север (ко жели да се вози назад иде трамвајем). Постоји \(N\) станица метроа, и оне се могу поделити у три групе: јужне (јужно од Саве), северне (северно од Саве), и средишње (које се налазе баш испод корита Саве). Једна од јужних станица је главна полазна станица и има редни број 1, а једна од северних станица је главна долазна станица и има редни број 2.

\(M\) једносмерних метро тунели повезује станице. Важи следеће:

Дата вам је мапа метроа и време потребно да се прође кроз сваки од тунела. Потребно је да одговорите на \(Q\) упита следећих типова:

Описи функција

Потребно је да имплементирате функцију

где је:

Сви низови су индексирани од 1.

Пример

Нека је \(N = 6\), \(M = 7\), \(U = [1, 1, 5, 5, 3, 4, 6]\), \(V = [5, 6, 3, 4, 2, 2, 2]\), \(C = [1, 8, 2, 4, 5, 5, 2]\), \(Q = 4\), \(A = [-1, -1, 6, -1]\) и \(B = [1, 3, 7, 3]\).

Овај улаз описује метро у ком су станице \(1\) (главна полазна) и \(5\) јужне, станице \(3\), \(4\) и \(6\) средишње и станица \(2\) (главна долазна) северна. Могући путеви су:

Одговор на први упит је време кроз најбржи пут (\(8\)), а на други време кроз трећи најбржи пут (\(10\)). Након трећег упита време кроз последњи пут постаје \(12\) (јер је дужина тунела \(4 \to 2\) повећана), што је и одговор на последњи упит.

Дакле, очекиван излаз је \(R = [8, 10, ?, 12]\), где \(?\) представља члан који одговара упиту у ком се мења време проласка кроз тунел.

Ограничења

Подзадаци

Тест примери су подељени у шест подзадатака:

Детаљи имплементације

Потребно је да пошаљете тачно један фајл metro.cpp који имплементира поменуту функцију. Осим тражене функције, ваш фајл може садржати и додатне глобалне променљиве, помоћне функције и додатне библиотеке.

Ваша функција мора бити следећег облика:

void Resi(int N, int M, int *U, int *V, int *C, int Q, int *A, int *B, long long *R);

Вашим програмима је дозвољено да мењају садржај низова/матрица, али не смеју да приступају ван граница датих низова.

Уз задатак, обезбеђен вам је “template” фајл code.cpp које можете користити и мењати по потреби. Такође вам је обезбеђен програм grader.cpp који служи да лакше тестирате кодове. Овај програм учитава са стандардног улаза следеће податке:

Затим овај програм зове вашу функцију и штампа одговоре на упите које функција попуни у низу \(R\).