Advertisement
RaFiN_

Min Max LCA

Sep 9th, 2020
782
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.77 KB | None | 0 0
  1.  
  2. // Min Max LCA
  3. #include<bits/stdc++.h>
  4.  
  5. using namespace std;
  6.  
  7. #define ll long long
  8.  
  9. const int mod = 1e9 + 7;
  10.  
  11. const int N = 1e5 + 10;
  12. vector<pair<int,int>> edge[N];
  13.  
  14. int par[N],lev[N],table[N][18],Mn[N][18],Mx[N][18],cst[N];
  15.  
  16. void CLEAR() {
  17.     for(int i = 0; i < N; i++) {
  18.         edge[i].clear();
  19.         for(int j = 0; j < 18; j++) {
  20.             table[i][j] = -1;Mn[i][j] = 1e9,Mx[i][j] = -1e9;
  21.         }
  22.     }
  23. }
  24.  
  25. void dfs(int s,int p,int l,int c = 0) {
  26.     par[s] = p;
  27.     lev[s] = l;
  28.     cst[s] = c;
  29.     for(auto it : edge[s]) {
  30.         if(it.first == p) continue;
  31.         dfs(it.first,s,l+1,it.second);
  32.     }
  33. }
  34.  
  35. void lca_init(int n) {
  36.     for(int i = 1; i <= n; i++) {
  37.         table[i][0] = par[i];
  38.         Mx[i][0] = Mn[i][0] = cst[i];
  39.     }
  40.     for(int i = 1; i < 18; i++) {
  41.         for(int j = 1; j <= n; j++) {
  42.             if(table[j][i-1] != -1) {
  43.                 Mx[j][i] = max(Mx[table[j][i-1]][i-1],Mx[j][i-1]);
  44.                 Mn[j][i] = min(Mn[table[j][i-1]][i-1],Mn[j][i-1]);
  45.                 table[j][i] = table[table[j][i-1]][i-1];
  46.             }
  47.         }
  48.     }
  49. }
  50.  
  51. pair<int,int> lca_query(int u,int v) {
  52.     if(lev[u] > lev[v]) swap(u,v);
  53.     int mx = -1e9,mn = 1e9;
  54.     for(int i = 17; i >= 0; i--) {
  55.         if(table[v][i] == -1) continue;
  56.         int pp = table[v][i];
  57.         if(lev[pp] >= lev[u]) {
  58.             mn = min(mn,Mn[v][i]);
  59.             mx = max(mx,Mx[v][i]);
  60.             v = table[v][i];
  61.         }
  62.     }
  63.     if(u == v) {
  64.         return {mn,mx};
  65.     }
  66.  
  67.     for(int i = 17; i >= 0; i--) {
  68.         int uu = table[u][i];
  69.         int vv = table[v][i];
  70.         if(uu == -1 || vv == -1) continue;
  71.         if(uu != vv) {
  72.             mx = max(mx,max(Mx[u][i],Mx[v][i]));
  73.             mn = min(mn,min(Mn[u][i],Mn[v][i]));
  74.             u = uu;
  75.             v = vv;
  76.         }
  77.     }
  78.     mx = max(mx,max(Mx[u][0],Mx[v][0]));
  79.     mn = min(mn,min(Mn[u][0],Mn[v][0]));
  80.     return {mn,mx};
  81. }
  82.  
  83. int main() {
  84.  
  85.     ios_base::sync_with_stdio(0); cin.tie(0);
  86.     #ifndef ONLINE_JUDGE
  87.     freopen("input.txt", "r", stdin);
  88.     freopen("output.txt", "w", stdout);
  89.     #endif
  90.     int t;
  91.     scanf("%d",&t);
  92.     int ajinka = 1;
  93.     while(t--) {
  94.         int n;
  95.         scanf("%d",&n);
  96.         CLEAR();
  97.         for(int i = 0; i < n-1; i++) {
  98.             int u,v,w;
  99.             scanf("%d%d%d",&u,&v,&w);
  100.             edge[u].push_back({v,w});
  101.             edge[v].push_back({u,w});
  102.         }
  103.         dfs(1,-1,0);
  104.         lca_init(n);
  105.         int q;
  106.         scanf("%d",&q);
  107.         printf("Case %d:\n",ajinka++);
  108.         while(q--) {
  109.             int xx,yy;
  110.             scanf("%d%d",&xx,&yy);
  111.             pair<int,int> ans = lca_query(xx,yy);
  112.             printf("%d %d\n",ans.first,ans.second);
  113.         }
  114.     }
  115.     return 0;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement