orazma

c.cpp

Jul 20th, 2026
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.63 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define f first
  4. #define s second
  5. #define pb push_back
  6. #define mp make_pair
  7. #define ll long long
  8.  
  9. #define IOS ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
  10.  
  11. using namespace std;
  12. const int MAXN = 2e5 + 10;
  13. const int L = 17;
  14. const int INF = 1e9 + 7;
  15. const int EPS = 1e-6;
  16. int timer = 0;
  17.  
  18. vector <pair <int, int> > g[MAXN];
  19. pair <string, pair <int, int> > b[MAXN];
  20. int tin[MAXN], tout[MAXN];
  21. bool was[MAXN];
  22. int up[MAXN][18], maxx[MAXN][18], minn[MAXN][18];
  23. bool upper(int u, int v){
  24.     return (tin[u] <= tin[v] && tout[v] <= tout[u]);
  25. }
  26.  
  27. void dfs(int v, int pr = 0, int lenE = 0){
  28.     was[v] = 1;
  29.     tin[v] = ++timer;
  30.     up[v][0] = pr;
  31.     if (v == 1){
  32.         maxx[v][0] = -INF;
  33.         minn[v][0] = INF;
  34.     }
  35.     else{
  36.         maxx[v][0] = lenE;
  37.         minn[v][0] = lenE;
  38.     }
  39.     for (int i = 1; i <= L; i++){
  40.         up[v][i] = up[up[v][i - 1]][i - 1];
  41.         maxx[v][i] = max(maxx[v][i - 1], maxx[up[v][i - 1]][i - 1]);
  42.         minn[v][i] = min(minn[v][i - 1], minn[up[v][i - 1]][i - 1]);
  43.     }
  44.  
  45.  
  46.     for (auto [to, len] : g[v]){
  47.         if (!was[to]){
  48.             dfs(to, v, len);
  49.         }
  50.     }
  51.     tout[v] = ++timer;
  52. }
  53.  
  54. pair <int, int> lca(int a, int b){
  55.     int maxx_ans = -INF;
  56.     int minn_ans = INF;
  57.     if (!upper(a, b)){
  58.         for (int i = L; i >= 0; i--){
  59.             if (!upper(up[a][i], b)){
  60.                 maxx_ans = max(maxx_ans, maxx[a][i]);
  61.                 minn_ans = min(minn_ans, minn[a][i]);
  62.                 a = up[a][i];
  63.             }
  64.         }
  65.         maxx_ans = max(maxx_ans, maxx[a][0]);
  66.         minn_ans = min(minn_ans, minn[a][0]);
  67.     }
  68.     if (!upper(b, a)){
  69.         for (int i = L; i >= 0; i--){
  70.             if (!upper(up[b][i], a)){
  71.                 maxx_ans = max(maxx_ans, maxx[b][i]);
  72.                 minn_ans = min(minn_ans, minn[b][i]);
  73.                 b = up[b][i];
  74.             }
  75.         }
  76.  
  77.         maxx_ans = max(maxx_ans, maxx[b][0]);
  78.         minn_ans = min(minn_ans, minn[b][0]);
  79.     }
  80.     return make_pair(minn_ans, maxx_ans);
  81. }
  82.  
  83. void solve(){
  84.     tin[0] = 0;
  85.     tout[0] = INF;
  86.  
  87.     int q, n;
  88.     cin >> n;
  89.     for (int i = 1; i < n; i++){
  90.         int u, v, c;
  91.         cin >> u >> v >> c;
  92.         g[u].pb({v, c});
  93.         g[v].pb({u, c});
  94.     }
  95.  
  96.     dfs(1);
  97.     //cout << "$$$$$ " << endl;
  98.     cin >> q;
  99.     for (int i = 1; i <= q; i++){
  100.         int a, b;
  101.         cin >> a >> b;
  102.         pair <int, int> z = lca(a, b);
  103.         cout << z.f << ' ' << z.s << "\n";
  104.     }
  105. }
  106.  
  107. int main() {
  108.     IOS;
  109.     int t = 1;
  110.     //cin >> t;
  111.     while(t--){
  112.         solve();
  113.     }
  114.     return 0;
  115. }
  116.  
Advertisement
Add Comment
Please, Sign In to add comment