Advertisement
Guest User

ForAlisa

a guest
Feb 21st, 2018
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.22 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define pb push_back
  3. #define mp make_pair
  4. #define X first
  5. #define Y second
  6. #define ll long long
  7. #define pii pair<int, int>
  8. using namespace std;
  9.  
  10. struct node{
  11. int p, c, num;
  12. vector<int> g;
  13. };
  14.  
  15. node nodes[50005];
  16. int n, up[50005][20], x, y, tin[50005], ts, minr[50005][20], l, tout[50005], m;
  17.  
  18. void dfs(int vi, int p = 1){
  19. node v = nodes[vi];
  20. tin[vi] = ++ts;
  21. up[vi][0] = p;
  22. if(vi == 1){
  23. for(int i = 0; i <= l; ++i){
  24. minr[1][i] = 1e9;
  25. }
  26. }
  27. else{
  28. minr[vi][0] = v.c;
  29. }
  30. for(int i = 1; i <= l; ++i){
  31. up[vi][i] = up[up[vi][i - 1]][i - 1];
  32. minr[vi][i] = min(minr[vi][i - 1], minr[up[vi][i - 1]][i - 1]);
  33. }
  34. for(int i = 0; i < (int)v.g.size(); ++i){
  35. int to = nodes[v.g[i]].num;
  36. if(to != p){
  37. dfs(to, vi);
  38. }
  39. }
  40. tout[vi] = ++ts;
  41. }
  42.  
  43. bool upper(int a, int b){
  44. return tin[b] >= tin[a] && tout[b] <= tout[a];
  45. }
  46.  
  47. int lca(int a, int b){
  48. if(upper(a, b)) return a;
  49. if(upper(b, a)) return b;
  50. for(int i = l; i >= 0; --i){
  51. if(!upper(up[a][i], b)){
  52. a = up[a][i];
  53. }
  54. }
  55. return up[a][0];
  56. }
  57.  
  58. int getmin(int p, int s){
  59. if(p == s){
  60. return 1e9;
  61. }
  62. int minv = 1e9;
  63. for(int i = l; i >= 0; --i){
  64. if(!upper(up[s][i], p)){
  65. minv = min(minv, minr[s][i]);
  66. s = up[s][i];
  67. }
  68. }
  69. return min(minv, minr[s][0]);
  70. }
  71.  
  72. int ask(int a, int b){
  73. int m;
  74. m = lca(a, b);
  75. return min(getmin(m, a), getmin(m, b));
  76. }
  77.  
  78. int main(){
  79. #ifdef DEBUG
  80. freopen("input.txt", "r", stdin);
  81. #endif // DEBUG
  82. freopen("minonpath.in", "r", stdin);
  83. freopen("minonpath.out", "w", stdout);
  84. ts = 0;
  85. cin >> n;
  86. nodes[1].p = -1;
  87. nodes[1].c = 1e9;
  88. nodes[1].num = 1;
  89. for(int i = 2; i <= n; ++i){
  90. cin >> x >> y;
  91. nodes[i].p = x;
  92. nodes[i].c = y;
  93. nodes[i].num = i;
  94. nodes[x].g.pb(i);
  95. }
  96. l = 1;
  97. while((1 << l) <= n) ++l;
  98. dfs(1);
  99. cin >> m;
  100. for(int i = 1; i <= m; ++i){
  101. cin >> x >> y;
  102. cout << ask(x, y) << endl;
  103. }
  104. return 0;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement