#include<bits/stdc++.h> using namespace std; const int N=1e5+13; #define st first #define nd second const long long inf = 1e18+5; int n, q, a, b, x, v, akt=1; long long c, d, wyn; long long z[N]; long long odl[N]; pair<int, long long>pom; vector<pair<int, long long> >V[N]; bool odw[N]; void read() { scanf("%d%d", &n, &q); for(int i=1; i<=n; i++){ scanf("%lld", &z[i]); } for(int i=1; i<n; i++){ scanf("%d%d%lld", &a, &b, &c); pom=make_pair(a, c); V[b].push_back(pom); pom=make_pair(b, c); V[a].push_back(pom); } } void dfs(int v) { odw[v]=1; for(int i=0; i<V[v].size(); i++){ if(!odw[V[v][i].st]){ odl[V[v][i].st]=odl[v]+V[v][i].nd; if(-odl[V[v][i].st]+z[V[v][i].st]>wyn){ wyn=-odl[V[v][i].st]+z[V[v][i].st]; akt=V[v][i].st; } else if(-odl[V[v][i].st]+z[V[v][i].st]==wyn){ akt=min(akt, V[v][i].st); } dfs(V[v][i].st); } } } void zapytania() { while(q--){ scanf("%d", &x); if(x==1){ scanf("%d%lld", &v, &d); z[v]=d; wyn=-inf; fill(odw, odw+n+7, 0); fill(odl, odl+n+7, 0); dfs(akt); } else{ scanf("%d%d%lld", &a, &b, &d); for(int i=0; i<V[a].size(); i++){ if(V[a][i].st==b) V[a][i].nd=d; } for(int i=0; i<V[b].size(); i++){ if(V[b][i].st==a) V[b][i].nd=d; } wyn=-inf; fill(odw, odw+n+7, 0); fill(odl, odl+n+7, 0); dfs(akt); } printf("%d ", akt); } } int main() { read(); zapytania(); 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 | #include<bits/stdc++.h> using namespace std; const int N=1e5+13; #define st first #define nd second const long long inf = 1e18+5; int n, q, a, b, x, v, akt=1; long long c, d, wyn; long long z[N]; long long odl[N]; pair<int, long long>pom; vector<pair<int, long long> >V[N]; bool odw[N]; void read() { scanf("%d%d", &n, &q); for(int i=1; i<=n; i++){ scanf("%lld", &z[i]); } for(int i=1; i<n; i++){ scanf("%d%d%lld", &a, &b, &c); pom=make_pair(a, c); V[b].push_back(pom); pom=make_pair(b, c); V[a].push_back(pom); } } void dfs(int v) { odw[v]=1; for(int i=0; i<V[v].size(); i++){ if(!odw[V[v][i].st]){ odl[V[v][i].st]=odl[v]+V[v][i].nd; if(-odl[V[v][i].st]+z[V[v][i].st]>wyn){ wyn=-odl[V[v][i].st]+z[V[v][i].st]; akt=V[v][i].st; } else if(-odl[V[v][i].st]+z[V[v][i].st]==wyn){ akt=min(akt, V[v][i].st); } dfs(V[v][i].st); } } } void zapytania() { while(q--){ scanf("%d", &x); if(x==1){ scanf("%d%lld", &v, &d); z[v]=d; wyn=-inf; fill(odw, odw+n+7, 0); fill(odl, odl+n+7, 0); dfs(akt); } else{ scanf("%d%d%lld", &a, &b, &d); for(int i=0; i<V[a].size(); i++){ if(V[a][i].st==b) V[a][i].nd=d; } for(int i=0; i<V[b].size(); i++){ if(V[b][i].st==a) V[b][i].nd=d; } wyn=-inf; fill(odw, odw+n+7, 0); fill(odl, odl+n+7, 0); dfs(akt); } printf("%d ", akt); } } int main() { read(); zapytania(); return 0; } |