Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define f first
- #define s second
- #define pb push_back
- #define mp make_pair
- #define ll long long
- #define IOS ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
- using namespace std;
- const int MAXN = 2e5 + 10;
- const int L = 17;
- const int INF = 1e9 + 7;
- const int EPS = 1e-6;
- int timer = 0;
- vector <pair <int, int> > g[MAXN];
- pair <string, pair <int, int> > b[MAXN];
- int tin[MAXN], tout[MAXN];
- bool was[MAXN];
- int up[MAXN][18], maxx[MAXN][18], minn[MAXN][18];
- bool upper(int u, int v){
- return (tin[u] <= tin[v] && tout[v] <= tout[u]);
- }
- void dfs(int v, int pr = 0, int lenE = 0){
- was[v] = 1;
- tin[v] = ++timer;
- up[v][0] = pr;
- if (v == 1){
- maxx[v][0] = -INF;
- minn[v][0] = INF;
- }
- else{
- maxx[v][0] = lenE;
- minn[v][0] = lenE;
- }
- for (int i = 1; i <= L; i++){
- up[v][i] = up[up[v][i - 1]][i - 1];
- maxx[v][i] = max(maxx[v][i - 1], maxx[up[v][i - 1]][i - 1]);
- minn[v][i] = min(minn[v][i - 1], minn[up[v][i - 1]][i - 1]);
- }
- for (auto [to, len] : g[v]){
- if (!was[to]){
- dfs(to, v, len);
- }
- }
- tout[v] = ++timer;
- }
- pair <int, int> lca(int a, int b){
- int maxx_ans = -INF;
- int minn_ans = INF;
- if (!upper(a, b)){
- for (int i = L; i >= 0; i--){
- if (!upper(up[a][i], b)){
- maxx_ans = max(maxx_ans, maxx[a][i]);
- minn_ans = min(minn_ans, minn[a][i]);
- a = up[a][i];
- }
- }
- maxx_ans = max(maxx_ans, maxx[a][0]);
- minn_ans = min(minn_ans, minn[a][0]);
- }
- if (!upper(b, a)){
- for (int i = L; i >= 0; i--){
- if (!upper(up[b][i], a)){
- maxx_ans = max(maxx_ans, maxx[b][i]);
- minn_ans = min(minn_ans, minn[b][i]);
- b = up[b][i];
- }
- }
- maxx_ans = max(maxx_ans, maxx[b][0]);
- minn_ans = min(minn_ans, minn[b][0]);
- }
- return make_pair(minn_ans, maxx_ans);
- }
- void solve(){
- tin[0] = 0;
- tout[0] = INF;
- int q, n;
- cin >> n;
- for (int i = 1; i < n; i++){
- int u, v, c;
- cin >> u >> v >> c;
- g[u].pb({v, c});
- g[v].pb({u, c});
- }
- dfs(1);
- //cout << "$$$$$ " << endl;
- cin >> q;
- for (int i = 1; i <= q; i++){
- int a, b;
- cin >> a >> b;
- pair <int, int> z = lca(a, b);
- cout << z.f << ' ' << z.s << "\n";
- }
- }
- int main() {
- IOS;
- int t = 1;
- //cin >> t;
- while(t--){
- solve();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment