int n; int a[kMaxN], b[kMaxN], c[kMaxN], t[kMaxN], buc[kMaxN]; std::vector<int> G[kMaxN];
__int128 getval(int t, int b, int c){ int lim; if (c >= 0) lim = t; else lim = std::min(t, (b - 1) / (-c)); return b * lim + (__int128)lim * (lim + 1) / 2 * c + t - lim; }
boolchk(int l, int r, int a, int b, int c){ returngetval(r, b, c) - getval(l - 1, b, c) >= a; }
voiddfs(int u, int fa){ for (auto v : G[u]) { if (v == fa) continue; dfs(v, u); t[u] = std::min(t[u], t[v] - 1); } }
boolcheck(int x){ staticint tt[kMaxN]; for (int i = 1; i <= n; ++i) { int L = 0, R = x + 1, res = -1e9; if (!chk(1, x, a[i], b[i], c[i])) return0; __int128 tot = getval(x, b[i], c[i]); while (L + 1 < R) { int mid = (L + R) >> 1; if (tot - getval(mid - 1, b[i], c[i]) >= a[i]) L = res = mid; else R = mid; } t[i] = res; } dfs(1, 0); int m1 = 0, m2 = n; for (int i = 1; i <= n; ++i) { if (t[i] <= 0) { return0; } } for (int i = 1; i <= n; ++i) { if (t[i] > n) tt[m2--] = t[i]; else ++buc[t[i]]; } for (int i = 1; i <= n; ++i) for (; buc[i]; --buc[i]) tt[++m1] = i; for (int i = 1; i <= n; ++i) t[i] = tt[i]; // std::sort(t + 1, t + 1 + n); for (int i = 1; i <= n; ++i) if (t[i] < i) return0; return1; }
voiddickdreamer(){ std::cin >> n; for (int i = 1; i <= n; ++i) std::cin >> a[i] >> b[i] >> c[i]; for (int i = 1; i < n; ++i) { int u, v; std::cin >> u >> v; G[u].emplace_back(v), G[v].emplace_back(u); } int L = 0, R = 1e9 + 1, res = 1e9; while (L + 1 < R) { int mid = (L + R) >> 1; if (check(mid)) R = res = mid; else L = mid; } std::cout << res << '\n'; }