Advertisement
Guest User

Dynamic LCA

a guest
Feb 23rd, 2021
418
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.88 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <array>
  4. #include <algorithm>
  5. #include <string>
  6. #include <set>
  7. #include <map>
  8. #include <unordered_map>
  9. #include <unordered_set>
  10. #include <cmath>
  11. #include <deque>
  12. #include <iomanip>
  13. #include <fstream>
  14. #include <ctime>
  15. #include <random>
  16. #include <queue>
  17. #define ios ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
  18. #define sz(a) (int)((a).size())
  19. #define fixed cout << setprecision(15) << fixed;
  20. #define all(v) (v).begin(), (v).end()
  21. #define debug(x) cerr << #x << " = " << x << '\n';
  22. #define debug2(x, y) cerr << #x << " = " << x <<", "<< #y << " = " << y <<"\n";
  23. #define debug3(x, y, z) cerr << #x << " = " << x << ", "<< #y << " = " << y << ", "<< #z << " = " << z <<"\n";
  24. #define debug_a(x) cerr << #x << '\n'; for (auto e : (x)) cerr << e << ' '; cout << '\n';
  25. #define debug_b(x) cerr << #x << '\n'; for (auto e : (x)) cerr << " ( " << e.first.first << ' ' << e.first.second << " ) "; cout << '\n';
  26. #define pikachu push_back
  27. #define st first
  28. #define nd second
  29. #pragma GCC optimize("Ofast")
  30. using namespace std;
  31. typedef int ll;
  32. typedef long double ld;
  33. const ll N = 5e4 + 2, INF = 1e9;
  34. /// /////////////////////////////////////////////////////////////////
  35. struct vertex {
  36.     ll num, deep, add, cnt, prior;
  37.     pair<ll, ll> min;
  38.     vertex* r, * l, * parent;
  39.     ll type;
  40. };
  41. /// ////////////////////////////////////////////////////////
  42. vector<vertex*> ver(N);
  43. ll boss[N], rang[N];
  44. ll get_boss(ll a) {                             // DSU
  45.     if (boss[a] == a) return a;
  46.     boss[a] = get_boss(boss[a]);
  47.     return boss[a];
  48. }
  49. void dsu(ll a, ll b) {
  50.     ll x = get_boss(a);
  51.     ll y = get_boss(b);
  52.     if (rang[x] > rang[y]) swap(x, y);
  53.     boss[x] = y;
  54.     rang[y] += rang[x];
  55. }
  56. //////////////////////////////////////////////////////////////
  57. ll cnt(vertex* v) { if (v == NULL) return 0; return v->cnt; }
  58. pair<ll, ll> min2(vertex* v) { if (v == NULL) return { INF, -1 }; return v->min; }
  59. /// //////////////////////////////////////////////////////////////////////////
  60. void upd(vertex * v) {                             // Обновление cnt, min + родителей
  61.     if (v == NULL) return;
  62.     if (v->l != NULL) v->l->parent = v, v->l->type = 0;
  63.     if (v->r != NULL) v->r->parent = v, v->r->type = 1;
  64.     v->min = min(min(min2(v->l), min2(v->r)), { v->deep, v->num });
  65.     v->cnt = 1 + cnt(v->r) + cnt(v->l);
  66. }
  67. void push(vertex * v) {
  68.     if (v == NULL) return;
  69.     v->deep += v->add;
  70.     v->min.st += v->add;
  71.     if (v->l != NULL) v->l->add += v->add;
  72.     if (v->r != NULL) v->r->add += v->add;
  73.     v->add = 0;
  74. }
  75. /// /////////////////////////////////////////////////////////////////////////////////////
  76. ll pos(vertex* v) {                         // Взятие порядквого номера вершины
  77.     if (v == NULL) return 0;
  78.     ll ans = pos(v->parent);
  79.     if (v->type == 0) ans -= cnt(v->r) + 1;
  80.     else ans += cnt(v->l) + 1;
  81.     return ans;
  82. }
  83. vertex* lead(vertex* v) {                 // Взятие главной вершины дерева
  84.     if (v->parent == NULL) return v;
  85.     return lead(v->parent);
  86. }
  87. /// /////////////////////////////////////////////////////////////////////
  88. vertex* merge(vertex * l, vertex * r) {          
  89.     push(l);
  90.     push(r);
  91.     if (l == NULL or r == NULL) {
  92.         if (l == NULL) return r;
  93.         else return l;
  94.     }
  95.     if (l->prior > r->prior) {
  96.         l->r = merge(l->r, r);
  97.         push(l->l);
  98.         upd(l);
  99.         return l;
  100.     }
  101.     else {
  102.         r->l = merge(l, r->l);
  103.         push(r->r);
  104.         upd(r);
  105.         return r;
  106.     }
  107. }
  108. pair<vertex*, vertex*> split(vertex * T, ll key, ll add = 0) {
  109.     if (T == NULL) {
  110.         return { NULL, NULL };
  111.     }
  112.     push(T);
  113.     ll z = add + cnt(T->l);
  114.     if (z < key) {
  115.         auto t = split(T->r, key, z + 1);
  116.         T->r = t.st;
  117.         push(T->l);
  118.         upd(T);
  119.         return { T, t.nd };
  120.     }
  121.     else {
  122.         auto t = split(T->l, key, add);
  123.         T->l = t.nd;
  124.         push(T->r);
  125.         upd(T);
  126.         return { t.st, T };
  127.     }
  128. }
  129. /// /////////////////////////////////////////////////////////////////////////////
  130. void unite(ll a, ll b) {  
  131.     if (get_boss(a) == get_boss(b) || ver[b]->deep != 0) return;
  132.     auto T = lead(ver[a]);
  133.     auto T2 = lead(ver[b]);
  134.     ll ps = pos(ver[a]);
  135.     auto t = split(T, ps);
  136.     auto d = split(t.st, ps - 1);
  137.     T2->add += d.nd->deep + 1;
  138.     vertex* v = new vertex{ ver[a]->num, d.nd->deep, 0, 1, rand(), {d.nd->deep, ver[a]->num}, NULL, NULL, NULL, 1 };
  139.     T = merge(merge(d.st, d.nd), T2);
  140.     T = merge(T, v);
  141.     T = merge(T, t.nd);
  142.     dsu(a, b);
  143. }
  144. /// //////////////////////////////////////////////////////////////////
  145. ll lca(ll a, ll b) {
  146.     if (get_boss(a) != get_boss(b)) return 0;
  147.     auto T = lead(ver[a]);
  148.     ll p1 = pos(ver[a]);
  149.     ll p2 = pos(ver[b]);
  150.     if (p1 > p2) swap(p1, p2);
  151.     auto t = split(T, p2);
  152.     auto d = split(t.st, p1 - 1);
  153.     ll ans = d.nd->min.nd;
  154.     T = merge(merge(d.st, d.nd), t.nd);
  155.     return ans;
  156. }
  157. /// ////////////////////////////////////////////////////////////////////////
  158. ll n, m, x, y, t, ans = 0;
  159. int main() {
  160.     ios;
  161.     for (ll i = 0; i < N; i++) rang[i] = 1, boss[i] = i;
  162.     for (ll i = 0; i < N; i++) {
  163.         ver[i] = new vertex{ i, 0, 0, 1, rand(), {0, i}, NULL, NULL, NULL, 1 };
  164.     }
  165.     cin >> n;
  166.     for (ll i = 1; i <= n; i++) {
  167.         cin >> x;
  168.         if (x != 0) unite(x, i);
  169.     }
  170.     cin >> m;
  171.     for (ll i = 0; i < m; i++) {
  172.         cin >> t;
  173.         if (t == 1) {
  174.             cin >> x >> y;
  175.             ll u = ((x + ans - 1) % n) + 1;
  176.             ll v = ((y + ans - 1) % n) + 1;
  177.             unite(v, u);
  178.         }
  179.         else {
  180.             cin >> x >> y;
  181.             ll u = ((x + ans - 1) % n) + 1;
  182.             ll v = ((y + ans - 1) % n) + 1;
  183.             ans = lca(u, v);
  184.             cout << ans << '\n';
  185.         }
  186.     }
  187. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement