/*
* BAN
* Autor: Szymon Tur
*/
#include <iostream>
#include <vector>
#define LLMIN -9223372036854775807
using namespace std;
struct cena_pd
{
int w_do;
long long cena;
};
long long * zarobek;
vector<cena_pd> * graf;
bool * visited;
long long cena_p = 0;
bool droga(int start, int finish, int pop)
{
int _q = 0;
visited[start] = true;
if (pop != -1)
for (int j = 0;j<graf[pop].size();j++)
if (graf[pop][j].w_do == start)
{
_q = graf[pop][j].cena;
cena_p += _q;
break;
}
if (start == finish) return true;
for (int w = 0;w<graf[start].size();w++)
{
if (visited[graf[start][w].w_do]) continue;
if (droga(graf[start][w].w_do, finish, start)) return true;
}
cena_p -= _q;
return false;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n, q;
cin >> n >> q;
zarobek = new long long[n];
visited = new bool[n];
for (int i = 0;i<n;i++) cin >> zarobek[i];
graf = new vector<cena_pd>[n];
int _x, _y;
long long _c;
cena_pd _f, _g;
for (int i = 0;i<n - 1;i++)
{
cin >> _x >> _y >> _c;
_f.w_do = _y - 1;
_f.cena = _c;
_g.w_do = _x - 1;
_g.cena = _c;
graf[_x - 1].push_back(_f);
graf[_y - 1].push_back(_g);
}
// dla każdego dnia
int a, w = 0, tw=0;
vector<int> kol;
long long max;
for (int i = 0;i<q;i++)
{
cin >> a;
if (a == 1)
{
cin >> _x >> _c;
zarobek[_x - 1] = _c;
}
else
{
cin >> _x >> _y >> _c;
for (int j = 0;j<graf[_x - 1].size();j++)
if (graf[_x - 1][j].w_do == _y - 1)
{
graf[_x - 1][j].cena = _c;
break;
}
for (int j = 0;j<graf[_y - 1].size();j++)
if (graf[_y - 1][j].w_do == _x - 1)
{
graf[_y - 1][j].cena = _c;
break;
}
}
max = LLMIN;
for (int j = 0;j<n;j++)
{
for (int ss = 0;ss<n;ss++) visited[ss] = false;
cena_p = 0;
if (w != j)
{
droga(w, j, -1);
if (zarobek[j] - cena_p > max)
{
tw = j;
max = zarobek[j] - cena_p;
}
}
}
w = tw;
kol.push_back(w + 1);
}
for (int i = 0;i<q;i++)
{
cout << kol[i] << " ";
}
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | /* * BAN * Autor: Szymon Tur */ #include <iostream> #include <vector> #define LLMIN -9223372036854775807 using namespace std; struct cena_pd { int w_do; long long cena; }; long long * zarobek; vector<cena_pd> * graf; bool * visited; long long cena_p = 0; bool droga(int start, int finish, int pop) { int _q = 0; visited[start] = true; if (pop != -1) for (int j = 0;j<graf[pop].size();j++) if (graf[pop][j].w_do == start) { _q = graf[pop][j].cena; cena_p += _q; break; } if (start == finish) return true; for (int w = 0;w<graf[start].size();w++) { if (visited[graf[start][w].w_do]) continue; if (droga(graf[start][w].w_do, finish, start)) return true; } cena_p -= _q; return false; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); int n, q; cin >> n >> q; zarobek = new long long[n]; visited = new bool[n]; for (int i = 0;i<n;i++) cin >> zarobek[i]; graf = new vector<cena_pd>[n]; int _x, _y; long long _c; cena_pd _f, _g; for (int i = 0;i<n - 1;i++) { cin >> _x >> _y >> _c; _f.w_do = _y - 1; _f.cena = _c; _g.w_do = _x - 1; _g.cena = _c; graf[_x - 1].push_back(_f); graf[_y - 1].push_back(_g); } // dla każdego dnia int a, w = 0, tw=0; vector<int> kol; long long max; for (int i = 0;i<q;i++) { cin >> a; if (a == 1) { cin >> _x >> _c; zarobek[_x - 1] = _c; } else { cin >> _x >> _y >> _c; for (int j = 0;j<graf[_x - 1].size();j++) if (graf[_x - 1][j].w_do == _y - 1) { graf[_x - 1][j].cena = _c; break; } for (int j = 0;j<graf[_y - 1].size();j++) if (graf[_y - 1][j].w_do == _x - 1) { graf[_y - 1][j].cena = _c; break; } } max = LLMIN; for (int j = 0;j<n;j++) { for (int ss = 0;ss<n;ss++) visited[ss] = false; cena_p = 0; if (w != j) { droga(w, j, -1); if (zarobek[j] - cena_p > max) { tw = j; max = zarobek[j] - cena_p; } } } w = tw; kol.push_back(w + 1); } for (int i = 0;i<q;i++) { cout << kol[i] << " "; } return 0; } |
English