#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; } |
English