Advertisement
K_Y_M_bl_C

Untitled

Dec 15th, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 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 0;
  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