#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MAXN = 1000005;
vector<int> adj[MAXN];
long long subtree_fans[MAXN];
int fans[MAXN];
long long total_fans = 0;
long long min_max_congestion = 2e18; // Juda katta son
int best_city = 0;
int N;
// Har bir tarmoqdagi muxlislar yig'indisini hisoblash
void dfs_fans(int u, int p) {
subtree_fans[u] = fans[u];
for (int v : adj[u]) {
if (v != p) {
dfs_fans(v, u);
subtree_fans[u] += subtree_fans[v];
}
}
}
// Eng maqbul shaharni topish
void dfs_solve(int u, int p) {
long long max_congestion = 0;
// Pastki tarmoqlardagi muxlislar soni
for (int v : adj[u]) {
if (v != p) {
max_congestion = max(max_congestion, subtree_fans[v]);
dfs_solve(v, u);
}
}
// Yuqori tomondagi (ota tomondagi) muxlislar soni
long long upper_fans = total_fans - subtree_fans[u];
max_congestion = max(max_congestion, upper_fans);
// Eng kichik maksimal tirbandlikni yangilash
if (max_congestion < min_max_congestion) {
min_max_congestion = max_congestion;
best_city = u;
}
}
int LocateCentre(int n, int p[], int s[], int d[]) {
N = n;
total_fans = 0;
for (int i = 0; i < n; i++) {
fans[i] = p[i];
total_fans += p[i];
adj[i].clear();
}
for (int i = 0; i < n - 1; i++) {
adj[s[i]].push_back(d[i]);
adj[d[i]].push_back(s[i]);
}
dfs_fans(0, -1);
dfs_solve(0, -1);
return best_city;
}
// Test qilish uchun main funksiyasi
int main() {
int n = 5;
int p[] = {10, 10, 10, 20, 20};
int s[] = {0, 1, 2, 3};
int d[] = {2, 2, 3, 4};
// Masalaning 1-betidagi misolga ko'ra (0-10, 1-10, 2-10, 3-20, 4-20)
// S va D massivlari qirralarni belgilaydi: 0-2, 1-2, 2-3, 3-4 [cite: 50]
cout << "Tavsiya etilgan shahar: " << LocateCentre(n, p, s, d) << endl;
return 0;
}