Submission #1059547

#TimeUsernameProblemLanguageResultExecution timeMemory
1059547nima_aryanSynchronization (JOI13_synchronization)C++17
100 / 100
223 ms29364 KiB
/**
 *    author:  NimaAryan
 *    created: 2024-03-04 20:34:56
**/
#include <bits/stdc++.h>

using namespace std;

#ifdef LOCAL
#include "algo/debug.h"
#endif

using i64 = long long;

template <typename T>
struct Fenwick {
  int n;
  std::vector<T> a;

  Fenwick(int n_ = 0) {
    init(n_);
  }

  void init(int n_) {
    n = n_;
    a.assign(n, T{});
  }

  void add(int x, const T& v) {
    for (int i = x + 1; i <= n; i += i & -i) {
      a[i - 1] = a[i - 1] + v;
    }
  }

  T sum(int x) {
    T ans{};
    for (int i = x; i > 0; i -= i & -i) {
      ans = ans + a[i - 1];
    }
    return ans;
  }

  T range_sum(int l, int r) {
    return sum(r) - sum(l);
  }

  int select(const T& k) {
    int x = 0;
    T cur{};
    for (int i = 1 << std::__lg(n); i; i /= 2) {
      if (x + i <= n && cur + a[x + i - 1] <= k) {
        x += i;
        cur = cur + a[x - 1];
      }
    }
    return x;
  }
};

struct Tree {
  int n;
  int maxup;
  vector<vector<int>> adj;
  vector<int> tin, tout;
  vector<int> dfn;
  vector<int> dep;
  vector<vector<int>> up;

  Tree(int n) : n(n), maxup(__lg(n) + 1) {
    adj.resize(n);
  }

  void add_edge(int x, int y) {
    adj[x].push_back(y);
    adj[y].push_back(x);
  }

  void work(int r = 0) {
    tin.resize(n), tout.resize(n);
    dfn.resize(n);
    dep.resize(n);
    up.assign(maxup + 1, vector<int>(n));
    int timer = 0;
    function<void(int, int)> dfs = [&](int x, int p) {
      dfn[x] = tin[x] = timer++;
      up[0][x] = p;
      for (int i = 1; i <= maxup; ++i) {
        up[i][x] = up[i - 1][up[i - 1][x]];
      }
      for (int y : adj[x]) {
        if (y != p) {
          dep[y] = dep[x] + 1;
          dfs(y, x);
        }
      }
      tout[x] = timer;
    };
    dfs(r, r);
  }

  bool anc(int x, int y) {
    return tin[x] <= tin[y] && tout[y] <= tout[x];
  }

  int lca(int x, int y) {
    if (anc(x, y)) {
      return x;
    }
    if (anc(y, x)) {
      return y;
    }
    for (int i = maxup; i >= 0; --i) {
      int nx = up[i][x];
      if (!anc(nx, y)) {
        x = nx;
      }
    }
    return up[0][x];
  }

  int dist(int x, int y) {
    return dep[x] + dep[y] - 2 * dep[lca(x, y)];
  }

  int jump(int x, int k) {
    for (int i = 0; i <= maxup; ++i) {
      if (k >> i & 1) {
        x = up[i][x];
      }
    }
    return x;
  }

  int walk(int x, int y, int k) {
    return k > dep[x] - dep[lca(x, y)] ? jump(y, dist(x, y) - k) : jump(x, k);
  }
};

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int n, m, q;
  cin >> n >> m >> q;

  vector<array<int, 2>> e;
  for (int i = 1; i < n; ++i) {
    int u, v;
    cin >> u >> v;
    --u, --v;
    e.push_back({u, v});
  }

  Tree t(n);
  for (auto& [u, v] : e) {
    t.add_edge(u, v);
  }
  t.work();

  for (auto& [u, v] : e) {
    if (t.dep[u] > t.dep[v]) {
      swap(u, v);
    }
  }

  Fenwick<int> f(n + 1);
  auto update = [&](int x, int c) {
    f.add(t.tin[x], +c);
    f.add(t.tout[x], -c);
  };
  auto get = [&](int x) {
    int r = x;
    for (int i = t.maxup; i >= 0; --i) {
      int y = t.up[i][r];
      if (f.sum(t.dfn[x] + 1) - f.sum(t.dfn[y] + 1) >= t.dep[x] - t.dep[y]) {
        r = y;
      }
    }
    return r;
  };

  vector<bool> open(n);
  vector<int> pre(n), cnt(n, 1);

  while (m--) {
    int i;
    cin >> i;
    --i;
    auto [x, y] = e[i];
    int r = get(x);
    if (open[i]) {
      pre[i] = cnt[y] = cnt[r];
      update(y, -1);
    } else {
      cnt[r] = cnt[r] + cnt[y] - pre[i];
      update(y, +1);
    }
    open[i] = !open[i];
  }

  while (q--) {
    int x;
    cin >> x;
    --x;
    cout << cnt[get(x)] << "\n";
  }

  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...