Advertisement
K_Y_M_bl_C

Untitled

Dec 15th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.85 KB | None | 0 0
  1. int solve()
  2. {
  3. int n;
  4. scanf("%d", &n);
  5. vi p(n), delta(n), r(n);
  6. for (int i = 0; i < n; ++i)
  7. p[i] = i;
  8. function<int(int)> get = [&](int u)
  9. {
  10. if (p[u] == u)
  11. return u;
  12. return get(p[u]);
  13. };
  14. function<int(int)> geth = [&](int u)
  15. {
  16. if (p[u] == u)
  17. return delta[u];
  18. return delta[u] + geth(p[u]);
  19. };
  20. auto unit = [&](int x, int y)
  21. {
  22. int cur = geth(x) + 1;
  23. x = get(x);
  24. y = get(y);
  25. if (x == y)
  26. return;
  27. if (r[x] < r[y])
  28. {
  29. delta[x] += cur;
  30. swap(x, y);
  31. cur = 0;
  32. }
  33. p[y] = x;
  34. delta[y] += cur - delta[x];
  35. if (r[x] == r[y])
  36. ++r[x];
  37. };
  38. vector<vi> up(16, vi(n, -1));
  39. for (int i = 0; i < n; ++i)
  40. {
  41. int x;
  42. scanf("%d", &x);
  43. if (x == 0)
  44. {
  45. continue;
  46. }
  47. --x;
  48. unit(x, i);
  49. up[0][i] = x;
  50. }
  51. function<int(int, int)> getup = [&](int l, int u)
  52. {
  53. if (l == -1)
  54. return -1;
  55. if (u == -1)
  56. return -1;
  57. if (geth(u) < (1 << l))
  58. return -1;
  59. if (up[l][u] != -1)
  60. return up[l][u];
  61. return up[l][u] = getup(l - 1, getup(l - 1, u));
  62. };
  63. auto getlca = [&](int x, int y)
  64. {
  65. int hx = geth(x);
  66. int hy = geth(y);
  67. if (hx < hy)
  68. swap(x, y), swap(hx, hy);
  69. int dst = hx - hy;
  70. for (int i = 15; i >= 0; --i)
  71. {
  72. if ((dst >> i) & 1)
  73. x = getup(i, x);
  74. }
  75. if (x == y)
  76. return x;
  77. for (int i = 15; i >= 0; --i)
  78. {
  79. int nx = getup(i, x);
  80. int ny = getup(i, y);
  81. if (nx != ny)
  82. x = nx, y = ny;
  83. }
  84. return getup(0, x);
  85. };
  86. int q;
  87. scanf("%d", &q);
  88. int lst = 0;
  89. while (q--)
  90. {
  91. int cmd;
  92. scanf("%d", &cmd);
  93. if (cmd)
  94. {
  95. int x, y;
  96. scanf("%d %d", &x, &y);
  97. --x, --y;
  98. x += lst;
  99. y += lst;
  100. x %= n;
  101. y %= n;
  102. unit(y, x);
  103. up[0][x] = y;
  104. }
  105. else
  106. {
  107. int x, y;
  108. scanf("%d %d", &x, &y);
  109. --x, --y;
  110. x += lst;
  111. y += lst;
  112. x %= n;
  113. y %= n;
  114. if (get(x) != get(y))
  115. {
  116. puts("0");
  117. lst = 0;
  118. continue;
  119. }
  120. lst = getlca(x, y) + 1;
  121. printf("%d\n", lst);
  122. }
  123. }
  124. return 0;
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement