Advertisement
Guest User

Untitled

a guest
Feb 19th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.58 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6.  
  7. const int sz = 755;
  8.  
  9. const int N = 2e5 + 1;
  10. const int LOG = 19;
  11. vector <int> g[N];
  12. int w[N];
  13. int mx[N];
  14. int tin[N];
  15. int tout[N];
  16. int rt[N];
  17. int up[N][LOG];
  18. int we[N][LOG];
  19. int he[N];
  20.  
  21. int tt = 0;
  22.  
  23. void dfs(int v, int pr, int root, int cur, int sum)
  24. {
  25.     he[v] = sum;
  26.     tin[v] = tt++;
  27.     rt[v] = root;
  28.     cur = max(cur, w[v]);
  29.     mx[v] = cur;
  30.     up[v][0] = pr;
  31.     we[v][0] = w[v];
  32.     for (int i = 1; i < LOG; i++)
  33.     {
  34.         up[v][i] = up[up[v][i - 1]][i - 1];
  35.         we[v][i] = max(we[up[v][i - 1]][i - 1], we[v][i - 1]);
  36.     }
  37.     for (auto to : g[v])
  38.     {
  39.         if (to != pr)
  40.         {
  41.             dfs(to, v, root, cur, sum + 1);
  42.         }
  43.     }
  44.     tout[v] = tt++;
  45. }
  46.  
  47. int main()
  48. {
  49. #ifdef ONPC
  50.     freopen("a.in", "r", stdin);
  51.     //freopen("a.out", "w", stdout);
  52. #else
  53.     //freopen("a.in", "r", stdin);
  54.     //freopen("a.out", "w", stdout);
  55. #endif
  56.     int n, m;
  57.     scanf("%d%d", &n, &m);
  58.     vector <int> pr(n);
  59.     vector <bool> change(n);
  60.     for (int i = 1; i < n; i++)
  61.     {
  62.         scanf("%d", &pr[i]);
  63.     }
  64.     for (int i = 1; i < n; i++)
  65.     {
  66.         scanf("%d", &w[i]);
  67.     }
  68.     vector <pair <int, int> > e;
  69.     for (int i = 0; i < m; i++)
  70.     {
  71.         int u, v;
  72.         scanf("%d%d", &u, &v);
  73.         e.push_back({u, v});
  74.     }
  75.     for (int i = 0; i < m; i += sz)
  76.     {
  77.         vector <bool> glav(n);
  78.         glav[0] = 1;
  79.         int en = min(m, i + sz);
  80.         for (int j = i; j < en; j++)
  81.         {
  82.             glav[e[j].first] = 1;
  83.             glav[e[j].second] = 1;
  84.         }
  85.         for (int i = 0; i < n; i++)
  86.         {
  87.             g[i].clear();
  88.         }
  89.         for (int i = 0; i < n; i++)
  90.         {
  91.             if (!glav[i])
  92.             {
  93.                 g[pr[i]].push_back(i);
  94.             }
  95.         }
  96.         tt = 0;
  97.         for (int i = 0; i < n; i++)
  98.         {
  99.             if (glav[i])
  100.             {
  101.                 dfs(i, -1, i, 0, 0);
  102.             }
  103.         }
  104.         for (int j = i; j < en; j++)
  105.         {
  106.             int u = e[j].first, v = e[j].second;
  107.             if (u == v)
  108.             {
  109.                 puts("-1");
  110.                 continue;
  111.             }
  112.             int cur = v;
  113.             bool vis = 0;
  114.             int mix = 0;
  115.             if (rt[cur] == rt[u])
  116.             {
  117.                 vis = true;
  118.             }
  119.             else
  120.             {
  121.                 while (cur != 0)
  122.                 {
  123.                     mix = max(mix, mx[cur]);
  124.                     cur = pr[rt[cur]];
  125.                     if (rt[cur] == rt[u])
  126.                     {
  127.                         vis = true;
  128.                         break;
  129.                     }
  130.                 }
  131.             }
  132.             if (!vis)
  133.             {
  134.                 pr[u] = v;
  135.             }
  136.             else
  137.             {
  138.                 v = cur;
  139.                 if (tin[u] <= tin[v] && tout[u] >= tout[v])
  140.                 {
  141.                     int h = he[v] - he[u];
  142.                     int cur = v;
  143.                     for (int i = LOG - 1; i >= 0; i--)
  144.                     {
  145.                         if (h >= (1 << i))
  146.                         {
  147.                             h -= (1 << i);
  148.                             mix = max(mix, we[cur][i]);
  149.                             cur = up[cur][i];
  150.                         }
  151.                     }
  152.                     printf("%d\n", mix);
  153.                 }
  154.                 else
  155.                 {
  156.                     pr[u] = v;
  157.                 }
  158.             }
  159.         }
  160.     }
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement