Advertisement
Guest User

Untitled

a guest
May 23rd, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.45 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int p[200500];
  6. int lvl[200500];
  7. int dp[200500][18];
  8.  
  9. int lca(int x, int y) {
  10. if (lvl[x] < lvl[y]) return lca(y, x);
  11. int dif = lvl[x] - lvl[y];
  12. int lift = 0;
  13. while (dif > 0) {
  14. if (dif & 1) x = dp[x][lift];
  15. dif >>= 1;
  16. ++lift;
  17. }
  18. for (int i = 17; i >= 0; --i) {
  19. if (dp[x][i] != dp[y][i]) {
  20. x = dp[x][i];
  21. y = dp[y][i];
  22. }
  23. }
  24. if (x != y) return dp[x][0];
  25. else return x;
  26. }
  27.  
  28. int justice(int ind) {
  29. if (ind == p[ind]) return ind;
  30. else return p[ind] = justice(p[ind]);
  31. }
  32.  
  33. void victim(int x, int y) {
  34. x = justice(x);
  35. y = justice(y);
  36. if (x == y) return;
  37. if (lvl[x] < lvl[y]) p[y] = x;
  38. else p[x] = y;
  39. }
  40.  
  41. int main() {
  42. int m;
  43. cin >> m;
  44. p[0] = 0;
  45. int n = 1;
  46. for (int i = 0; i < m; ++i) {
  47. char c;
  48. cin >> c;
  49. if (c == '+') {
  50. int v;
  51. cin >> v;
  52. dp[n][0] = v - 1;
  53. p[n] = n;
  54. lvl[n] = lvl[v - 1] + 1;
  55. for (int j = 1; j < 18; ++j) dp[n][j] = dp[dp[n][j - 1]][j - 1];
  56. ++n;
  57. } else if (c == '-') {
  58. int v;
  59. cin >> v;
  60. victim(v - 1, dp[v - 1][0]);
  61. } else if (c == '?') {
  62. int u, v;
  63. cin >> u >> v;
  64. cout << justice(lca(u - 1, v - 1)) + 1 << '\n';
  65. }
  66. }
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement