Advertisement
tien_noob

Find smallest number exists odd times on path from u -> v(Hashing, probabilities)

Jun 13th, 2022
622
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.36 KB | None | 0 0
  1. //Make CSP great again
  2. //Vengeance
  3. #include <bits/stdc++.h>
  4. #define TASK "TESTCODE"
  5. #define Log2(x) 31 - __builtin_clz(x)
  6. using namespace std;
  7. const int N = 3e5, cbit = 18;
  8. mt19937 rd(chrono::steady_clock::now().time_since_epoch().count());
  9. vector<int> adj[N + 1];
  10. int depth[N + 1], f[N + 1][cbit + 1], tin[N + 1], tout[N + 1], timer, n, q;
  11. int s[N + 1], a[N + 1];
  12. struct FenwickTree
  13. {
  14.     int Tree[N + 1];
  15.     void reset()
  16.     {
  17.         memset(Tree, 0, sizeof(Tree));
  18.     }
  19.     void add(int pos, int val)
  20.     {
  21.         for (; pos <= n; pos |= pos + 1)
  22.         {
  23.             Tree[pos] ^= val;
  24.         }
  25.     }
  26.     int get(int pos)
  27.     {
  28.         int ret = 0;
  29.         for (; pos >= 0; pos = (pos & (pos + 1)) - 1)
  30.         {
  31.             ret ^= Tree[pos];
  32.         }
  33.         return ret;
  34.     }
  35. } tree;
  36. vector<int> timeline[N + 1];
  37. void read()
  38. {
  39.     cin >> n >> q;
  40.     for (int i = 1; i <= n; ++ i)
  41.     {
  42.         s[i] = rd();
  43.         s[i] = abs(s[i]);
  44.     }
  45.     for (int i = 1; i <= n; ++ i)
  46.     {
  47.         cin >> a[i];
  48.         timeline[a[i]].push_back(i);
  49.     }
  50.     for (int i = 1; i < n; ++ i)
  51.     {
  52.         int u, v;
  53.         cin >> u >> v;
  54.         adj[u].push_back(v);
  55.         adj[v].push_back(u);
  56.     }
  57. }
  58. void DFS(int u, int p)
  59. {
  60.     tin[u] = ++timer;
  61.     for (int v : adj[u])
  62.     {
  63.         if (v == p)
  64.         {
  65.             continue;
  66.         }
  67.         depth[v] = depth[u] + 1;
  68.         f[v][0] = u;
  69.         for (int i = 1; i <= cbit; ++ i)
  70.         {
  71.             f[v][i] = f[f[v][i - 1]][i - 1];
  72.         }
  73.         DFS(v, u);
  74.     }
  75.     tout[u] = timer;
  76. }
  77. int LCA(int u, int v)
  78. {
  79.     if (depth[u] > depth[v])
  80.     {
  81.         swap(u, v);
  82.     }
  83.     int k = depth[v] - depth[u];
  84.     for (int i = cbit; i >= 0; -- i)
  85.     {
  86.         if ((k >> i) & 1)
  87.         {
  88.             v = f[v][i];
  89.         }
  90.     }
  91.     if (u == v)
  92.     {
  93.         return u;
  94.     }
  95.     for (int i = cbit; i >= 0; -- i)
  96.     {
  97.         if (f[v][i] != f[u][i])
  98.         {
  99.             u = f[u][i];
  100.             v = f[v][i];
  101.         }
  102.     }
  103.     return f[u][0];
  104. }
  105. int u[N + 1], v[N + 1], p[N + 1], l[N + 1], r[N + 1], low[N + 1], high[N + 1], res[N + 1];
  106. int store[N + 1];
  107. vector<pair<int, int> > query[N + 1];
  108. void solve()
  109. {
  110.     DFS(1, 0);
  111.     for (int i = 1; i <= q; ++ i)
  112.     {
  113.         cin >> u[i] >> v[i] >> l[i] >> r[i];
  114.         p[i] = LCA(u[i], v[i]);
  115.         low[i] = l[i];
  116.         high[i] = r[i];
  117.         res[i] = -1;
  118.     }
  119.     while(true)
  120.     {
  121.         bool stop = true;
  122.         for (int i = 0; i <= n; ++ i)
  123.         {
  124.             query[i].clear();
  125.         }
  126.         for (int i = 1; i <= q; ++ i)
  127.         {
  128.             if (low[i] <= high[i])
  129.             {
  130.                 stop = false;
  131.                 int mid = (low[i] + high[i])/2;
  132.                 query[l[i] - 1].emplace_back(0, i);
  133.                 query[mid].emplace_back(1, i);
  134.             }
  135.         }
  136.         if (stop)
  137.         {
  138.             break;
  139.         }
  140.         tree.reset();
  141.         for (int x = 0; x <= n; ++ x)
  142.         {
  143.             for (int u : timeline[x])
  144.             {
  145.                 tree.add(tin[u], s[a[u]]);
  146.                 tree.add(tout[u] + 1, s[a[u]]);
  147.             }
  148.             for (auto &[t, i] : query[x])
  149.             {
  150.                 int k = p[i];
  151.                 int cur = tree.get(tin[u[i]]) ^ tree.get(tin[v[i]]) ^ (a[k] <= x ? s[a[k]] : 0);
  152.                 if (t == 0)
  153.                 {
  154.                     store[i] = cur;
  155.                 }
  156.                 else
  157.                 {
  158.                     cur ^= store[i];
  159.                     if (cur > 0)
  160.                     {
  161.                         high[i] = x - 1;
  162.                         res[i] = x;
  163.                     }
  164.                     else
  165.                     {
  166.                         low[i] = x + 1;
  167.                     }
  168.                 }
  169.             }
  170.         }
  171.     }
  172.     for (int i = 1; i <= q; ++ i)
  173.     {
  174.         cout << res[i] << '\n';
  175.     }
  176. }
  177. int main()
  178. {
  179.     ios_base::sync_with_stdio(false);
  180.     cin.tie(nullptr);
  181.     if (fopen(TASK".INP", "r"))
  182.     {
  183.         freopen(TASK".INP", "r", stdin);
  184.         //freopen(TASK".OUT", "w", stdout);
  185.     }
  186.     int t = 1;
  187.     bool typetest = false;
  188.     if (typetest)
  189.     {
  190.         cin >> t;
  191.     }
  192.     for (int __ = 1; __ <= t; ++ __)
  193.     {
  194.         //cout << "Case #" << __ << ":" << '\n';
  195.         read();
  196.         solve();
  197.     }
  198. }
  199.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement