#include <bits/stdc++.h>
int Query(int u, int v, int w);
void Bridge(int u, int v);
void Solve(int n) {
  auto query = [&](int a, int b, int c) {
    if (a == b or a == c) {
      return a;
    }
    if (b == c) {
      return b;
    }
    return Query(a, b, c);
  };
  auto bridge = [&](int a, int b) { Bridge(std::min(a, b), std::max(a, b)); };
  std::random_device rd;
  std::mt19937 rng(rd());
  auto solve = [&](auto &&self, std::vector<int> v) {
    if (v.size() < 2) {
      return;
    }
    if (v.size() < 3) {
      bridge(v[0], v[1]);
      return;
    }
    std::uniform_int_distribution<int> dist(0, v.size() - 1);
    int a = dist(rng);
    int b = a;
    while (a == b) {
      b = dist(rng);
    }
    a = v[a], b = v[b];
    std::vector<int> path;
    std::map<int, std::vector<int>> subtree;
    subtree[a].push_back(a), subtree[b].push_back(b);
    for (int i = 0; i < v.size(); ++i) {
      if (v[i] == a or v[i] == b) {
        continue;
      }
      int q = query(a, v[i], b);
      subtree[q].push_back(v[i]);
      if (q == v[i]) {
        path.push_back(v[i]);
      }
    }
    std::sort(path.begin(), path.end(),
              [&](int i, int j) { return query(a, i, j) == i; });
    if (path.empty()) {
      bridge(a, b);
    } else {
      bridge(a, path[0]);
      for (int i = 1; i < path.size(); ++i) {
        bridge(path[i - 1], path[i]);
      }
      bridge(path.back(), b);
    }
    for (auto &[u, sub] : subtree) {
      self(self, sub);
    }
  };
  std::vector<int> v(n);
  std::iota(v.begin(), v.end(), 0);
  solve(solve, v);
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |