#include <bits/stdc++.h> using namespace std; #define MAXN 100005 typedef long long ll; vector<pair<int, ll>> adj[MAXN]; int v, q, a, b; ll w; ll ceny[MAXN]; ll odleglosc[MAXN]; int znajdz(int poz) { for(int i = 0; i < v; i++) { odleglosc[i] = -1ll; } odleglosc[poz] = 0; queue<int> kol; kol.push(poz); while(!kol.empty()) { int x = kol.front(); kol.pop(); for(int i = 0; i < adj[x].size(); i++) { if (odleglosc[adj[x][i].first] == -1ll) { odleglosc[adj[x][i].first] = odleglosc[x] + adj[x][i].second; kol.push(adj[x][i].first); } } } int best = -1; ll value = -1000000000000000000ll; for(int i = 0; i < v; i++){ if (i == poz) continue; // printf("c o %lld %lld value %lld\n", ceny[i], odleglosc[i], value); // printf("%lld %lld %lld\n", ceny[i] - odleglosc[i], value, ceny[i] - odleglosc[i] > value); if ((ceny[i] - odleglosc[i]) > value) { // printf("c o %d %d\n", ceny[i], odleglosc[i]); best = i; value = ceny[i] - odleglosc[i]; } } // printf("%d\n", value); return best; } int main(){ scanf("%d%d", &v, &q); for(int i = 0; i < v; i++) scanf("%lld", &ceny[i]); for(int i = 0; i < v - 1; i++){ scanf("%d%d%lld", &a, &b, &w); a--;b--; adj[a].push_back(make_pair(b,w)); adj[b].push_back(make_pair(a,w)); } for(int i = 0; i < v; i++) sort(adj[i].begin(), adj[i].end()); int pozycja = 0; while(q--){ int t; ll z; scanf("%d", &t); if (t == 1) { scanf("%d%lld", &a, &z); a--; // printf("zmienilem cene %d ", a); ceny[a] = z; } else { scanf("%d%d%lld", &a, &b, &w); a--; b--; *lower_bound(adj[a].begin(), adj[a].end(), make_pair(b, -1ll)) = make_pair(b, w); *lower_bound(adj[b].begin(), adj[b].end(), make_pair(a, -1ll)) = make_pair(a,w); // printf("zmienilem %d na ", a); // for(int i = 0; i < adj[a].size(); i++){ printf("(%d %d)", adj[a][i].first, adj[a][i].second);} // printf("\n"); } int najlepsze = znajdz(pozycja); printf("%d ", najlepsze+1); pozycja = najlepsze; } printf("\n"); }
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 | #include <bits/stdc++.h> using namespace std; #define MAXN 100005 typedef long long ll; vector<pair<int, ll>> adj[MAXN]; int v, q, a, b; ll w; ll ceny[MAXN]; ll odleglosc[MAXN]; int znajdz(int poz) { for(int i = 0; i < v; i++) { odleglosc[i] = -1ll; } odleglosc[poz] = 0; queue<int> kol; kol.push(poz); while(!kol.empty()) { int x = kol.front(); kol.pop(); for(int i = 0; i < adj[x].size(); i++) { if (odleglosc[adj[x][i].first] == -1ll) { odleglosc[adj[x][i].first] = odleglosc[x] + adj[x][i].second; kol.push(adj[x][i].first); } } } int best = -1; ll value = -1000000000000000000ll; for(int i = 0; i < v; i++){ if (i == poz) continue; // printf("c o %lld %lld value %lld\n", ceny[i], odleglosc[i], value); // printf("%lld %lld %lld\n", ceny[i] - odleglosc[i], value, ceny[i] - odleglosc[i] > value); if ((ceny[i] - odleglosc[i]) > value) { // printf("c o %d %d\n", ceny[i], odleglosc[i]); best = i; value = ceny[i] - odleglosc[i]; } } // printf("%d\n", value); return best; } int main(){ scanf("%d%d", &v, &q); for(int i = 0; i < v; i++) scanf("%lld", &ceny[i]); for(int i = 0; i < v - 1; i++){ scanf("%d%d%lld", &a, &b, &w); a--;b--; adj[a].push_back(make_pair(b,w)); adj[b].push_back(make_pair(a,w)); } for(int i = 0; i < v; i++) sort(adj[i].begin(), adj[i].end()); int pozycja = 0; while(q--){ int t; ll z; scanf("%d", &t); if (t == 1) { scanf("%d%lld", &a, &z); a--; // printf("zmienilem cene %d ", a); ceny[a] = z; } else { scanf("%d%d%lld", &a, &b, &w); a--; b--; *lower_bound(adj[a].begin(), adj[a].end(), make_pair(b, -1ll)) = make_pair(b, w); *lower_bound(adj[b].begin(), adj[b].end(), make_pair(a, -1ll)) = make_pair(a,w); // printf("zmienilem %d na ", a); // for(int i = 0; i < adj[a].size(); i++){ printf("(%d %d)", adj[a][i].first, adj[a][i].second);} // printf("\n"); } int najlepsze = znajdz(pozycja); printf("%d ", najlepsze+1); pozycja = najlepsze; } printf("\n"); } |