Submission #1235113

#TimeUsernameProblemLanguageResultExecution timeMemory
1235113avighnaPrize (CEOI22_prize)C++17
0 / 100
1274 ms175112 KiB
#include <algorithm>
#include <array>
#include <iostream>
#include <vector>
#include <cassert>

int main() {
  int n, k, q, t;
  std::cin >> n >> k >> q >> t;
  std::vector<std::vector<int>> adj(n + 1);
  for (int i = 1, x; i <= n; ++i) {
    std::cin >> x;
  }
  for (int i = 1, x; i <= n; ++i) {
    std::cin >> x;
    if (x != -1) {
      adj[i].push_back(x);
      adj[x].push_back(i);
    }
  }
  std::vector<int> subset;
  std::vector lift(n + 1, std::array<int, 20>());
  std::vector<int> depth(n + 1);
  std::vector<int64_t> real_dep(n + 1);
  auto dfs = [&](auto &&self, int u, int p) -> void {
    if (subset.size() < k) {
      subset.push_back(u);
    }
    for (auto &i : adj[u]) {
      if (i == p) {
        continue;
      }
      depth[i] = depth[u] + 1, lift[i][0] = u;
      self(self, i, u);
    }
  };
  dfs(dfs, 1, 0);
  lift[1][0] = 1;
  for (int bt = 1; bt < 20; ++bt) {
    for (int i = 1; i <= n; ++i) {
      lift[i][bt] = lift[lift[i][bt - 1]][bt - 1];
    }
  }

  std::sort(subset.begin(), subset.end());
  for (auto &i : subset) {
    std::cout << i << ' ';
  }
  assert(subset.size() == k);
  std::cout << std::endl;
  for (int i = 1; i < k; ++i) {
    std::cout << "? 1 " << subset[i] << '\n';
  }
  std::cout << '!' << std::endl;
  for (int i = 1; i < k; ++i) {
    std::cin >> real_dep[subset[i]];
    std::cin >> real_dep[subset[i]];
    std::cin >> real_dep[subset[i]];
    std::cin >> real_dep[subset[i]];
  }

  auto lca = [&](int u, int v) {
    if (depth[u] < depth[v]) {
      std::swap(u, v);
    }
    int k = depth[u] - depth[v];
    for (int bt = 0; bt < 20; ++bt) {
      if (k & (1 << bt)) {
        u = lift[u][bt];
      }
    }
    if (u == v) {
      return u;
    }
    for (int bt = 19; bt >= 0; --bt) {
      if (lift[u][bt] != lift[v][bt]) {
        u = lift[u][bt], v = lift[v][bt];
      }
    }
    return lift[u][0];
  };

  std::vector<std::pair<int, int>> questions(t);
  for (auto &[a, b] : questions) {
    std::cin >> a >> b;
  }
  for (auto &[a, b] : questions) {
    int l = lca(a, b);
    auto it = std::lower_bound(subset.begin(), subset.end(), l);
    assert(it != subset.end());
    int64_t d = real_dep[a] + real_dep[b] - 2 * real_dep[l];
    std::cout << d << ' ' << d << '\n';
  }
  std::cout << std::flush;
}
#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...