Advertisement
K_Y_M_bl_C

Untitled

Dec 15th, 2017
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.82 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 (u == -1)
  54.             return -1;
  55.         if (geth(u) < (1 << l))
  56.             return -1;
  57.         if (up[l][u] != -1)
  58.             return up[l][u];
  59.         return up[l][u] = getup(l - 1, getup(l - 1, u));
  60.     };
  61.     auto getlca = [&](int x, int y)
  62.     {
  63.         int hx = geth(x);
  64.         int hy = geth(y);
  65.         if (hx < hy)
  66.             swap(x, y), swap(hx, hy);
  67.         int dst = hx - hy;
  68.         for (int i = 15; i >= 0; --i)
  69.         {
  70.             if ((dst >> i) & 1)
  71.                 x = getup(i, x);
  72.         }
  73.         if (x == y)
  74.             return x;
  75.         for (int i = 15; i >= 0; --i)
  76.         {
  77.             int nx = getup(i, x);
  78.             int ny = getup(i, y);
  79.             if (nx != ny)
  80.                 x = nx, y = ny;
  81.         }
  82.         return getup(0, x);
  83.     };
  84.     int q;
  85.     scanf("%d", &q);
  86.     int lst = 0;
  87.     while (q--)
  88.     {
  89.         int cmd;
  90.         scanf("%d", &cmd);
  91.         if (cmd)
  92.         {
  93.             int x, y;
  94.             scanf("%d %d", &x, &y);
  95.             --x, --y;
  96.             x += lst;
  97.             y += lst;
  98.             x %= n;
  99.             y %= n;
  100.             unit(y, x);
  101.             up[0][x] = y;
  102.         }
  103.         else
  104.         {
  105.             int x, y;
  106.             scanf("%d %d", &x, &y);
  107.             --x, --y;
  108.             x += lst;
  109.             y += lst;
  110.             x %= n;
  111.             y %= n;
  112.             if (get(x) != get(y))
  113.             {
  114.                 puts("0");
  115.                 lst = 0;
  116.                 continue;
  117.             }
  118.             lst = getlca(x, y) + 1;
  119.             printf("%d\n", lst);
  120.         }
  121.     }
  122.     return 0;
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement