Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int sz = 755;
- const int N = 2e5 + 1;
- const int LOG = 19;
- vector <int> g[N];
- int w[N];
- int mx[N];
- int tin[N];
- int tout[N];
- int rt[N];
- int up[N][LOG];
- int we[N][LOG];
- int he[N];
- int tt = 0;
- void dfs(int v, int pr, int root, int cur, int sum)
- {
- he[v] = sum;
- tin[v] = tt++;
- rt[v] = root;
- cur = max(cur, w[v]);
- mx[v] = cur;
- up[v][0] = pr;
- we[v][0] = w[v];
- for (int i = 1; i < LOG; i++)
- {
- up[v][i] = up[up[v][i - 1]][i - 1];
- we[v][i] = max(we[up[v][i - 1]][i - 1], we[v][i - 1]);
- }
- for (auto to : g[v])
- {
- if (to != pr)
- {
- dfs(to, v, root, cur, sum + 1);
- }
- }
- tout[v] = tt++;
- }
- int main()
- {
- #ifdef ONPC
- freopen("a.in", "r", stdin);
- //freopen("a.out", "w", stdout);
- #else
- //freopen("a.in", "r", stdin);
- //freopen("a.out", "w", stdout);
- #endif
- int n, m;
- scanf("%d%d", &n, &m);
- vector <int> pr(n);
- vector <bool> change(n);
- for (int i = 1; i < n; i++)
- {
- scanf("%d", &pr[i]);
- }
- for (int i = 1; i < n; i++)
- {
- scanf("%d", &w[i]);
- }
- vector <pair <int, int> > e;
- for (int i = 0; i < m; i++)
- {
- int u, v;
- scanf("%d%d", &u, &v);
- e.push_back({u, v});
- }
- for (int i = 0; i < m; i += sz)
- {
- vector <bool> glav(n);
- glav[0] = 1;
- int en = min(m, i + sz);
- for (int j = i; j < en; j++)
- {
- glav[e[j].first] = 1;
- glav[e[j].second] = 1;
- }
- for (int i = 0; i < n; i++)
- {
- g[i].clear();
- }
- for (int i = 0; i < n; i++)
- {
- if (!glav[i])
- {
- g[pr[i]].push_back(i);
- }
- }
- tt = 0;
- for (int i = 0; i < n; i++)
- {
- if (glav[i])
- {
- dfs(i, -1, i, 0, 0);
- }
- }
- for (int j = i; j < en; j++)
- {
- int u = e[j].first, v = e[j].second;
- if (u == v)
- {
- puts("-1");
- continue;
- }
- int cur = v;
- bool vis = 0;
- int mix = 0;
- if (rt[cur] == rt[u])
- {
- vis = true;
- }
- else
- {
- while (cur != 0)
- {
- mix = max(mix, mx[cur]);
- cur = pr[rt[cur]];
- if (rt[cur] == rt[u])
- {
- vis = true;
- break;
- }
- }
- }
- if (!vis)
- {
- pr[u] = v;
- }
- else
- {
- v = cur;
- if (tin[u] <= tin[v] && tout[u] >= tout[v])
- {
- int h = he[v] - he[u];
- int cur = v;
- for (int i = LOG - 1; i >= 0; i--)
- {
- if (h >= (1 << i))
- {
- h -= (1 << i);
- mix = max(mix, we[cur][i]);
- cur = up[cur][i];
- }
- }
- printf("%d\n", mix);
- }
- else
- {
- pr[u] = v;
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement