DSA
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

63 lines
1.1 KiB

  1. #include <bits/stdc++.h>
  2. using namespace std ;
  3. vector <int> g[500001] ;
  4. int n , m , lvl[500001] , used[500001] , k , up[500001][21] ;
  5. void dfs(int v , int p)
  6. {
  7. used[v] = 1 ;
  8. up[v][0] = p ;
  9. for (int jump = 20 ; jump >= 1 ; --jump)
  10. up[v][jump] = up[up[v][jump-1]][jump-1] ;
  11. for (int i = 0 ; i < g[v].size() ; ++i)
  12. {
  13. int to = g[v][i] ;
  14. if (!used[to])
  15. {
  16. lvl[to] = lvl[v] + 1 ;
  17. dfs(to, v) ;
  18. }
  19. }
  20. }
  21. int lca(int a , int b)
  22. {
  23. if (lvl[a] < lvl[b])
  24. swap(a,b) ;
  25. for (int jump = 20 ; jump >= 0 ; --jump)
  26. if (lvl[up[b][jump]] >= lvl[a])
  27. b = up[b][jump] ;
  28. if (a == b)
  29. return b ;
  30. for (int jump = 20 ; jump >= 0 ; --jump)
  31. if (up[a][jump] != up[b][jump])
  32. a = up[a][jump] ,
  33. b = up[b][jump] ;
  34. return up[a][0] ;
  35. }
  36. main()
  37. {
  38. cin >> n ;
  39. vector<pair<int,int> >z ;
  40. for (int i = 0 ; i < n ; ++i)
  41. {
  42. string s ;
  43. cin >> s ;
  44. int a , b ;
  45. cin >> a >> b;
  46. if(s=="ADD")
  47. g[a].push_back(b) ;
  48. else
  49. z.push_back(make_pair(a,b)) ;
  50. }
  51. lvl[1] = 1 ;
  52. dfs(1, 1) ;
  53. for (int i = 0 ; i < z.size() ; ++i)
  54. cout << lca(z[i].first,z[i].second) << '\n' ;
  55. }