#include <bits/stdc++.h>
int Query(const std::vector<int> &p);
void Answer(int a, int b);
void Solve(int N) {
  std::vector<std::vector<int>> adj(2 * N + 1), ans(2 * N + 1);
  auto add = [&](int u, int v) {
    adj[u].push_back(v);
    ans[u].push_back(v);
    adj[v].push_back(u);
    ans[v].push_back(u);
  };
  auto bipartite = [&](int n) -> std::array<std::vector<int>, 2> {
    std::vector<int> a, b;
    if (n == 0) {
      return {a, b};
    }
    std::vector<bool> color(n + 1), vis(n + 1);
    auto dfs = [&](auto &&self, int u) {
      if (vis[u]) {
        return;
      }
      vis[u] = true;
      for (int &i : adj[u]) {
        color[i] = !color[u];
        self(self, i);
      }
    };
    for (int i = 1; i <= n; ++i) {
      dfs(dfs, i);
    }
    for (int i = 1; i <= n; ++i) {
      (color[i] ? a : b).push_back(i);
    }
    return {a, b};
  };
  for (int i = 1; i <= 2 * N; ++i) {
    for (auto &a : bipartite(i - 1)) {
      int j = 0;
      while (j != a.size()) {
        j = *std::ranges::partition_point(std::views::iota(0, int(a.size())), [&](int len) {
          std::vector<int> pref(len + 1);
          for (int _ = 0; _ <= len; ++_) {
            pref[_] = a[_];
          }
          for (int &x : adj[i]) {
            auto it = std::find(pref.begin(), pref.end(), x);
            if (it != pref.end()) {
              pref.erase(it);
            }
          }
          pref.push_back(i);
          return Query(pref) > pref.size() - 1;
        });
        if (j != a.size()) {
          add(i, a[j]);
        }
      }
    }
  }
  auto remove = [&](int u, int v) {
    auto it1 = std::find(ans[u].begin(), ans[u].end(), v);
    auto it2 = std::find(ans[v].begin(), ans[v].end(), u);
    if (it1 != ans[u].end()) {
      ans[u].erase(it1);
    }
    if (it2 != ans[v].end()) {
      ans[v].erase(it2);
    }
  };
  for (int u = 1; u <= 2 * N; ++u) {
    if (adj[u].size() == 1) {
      continue;
    }
    int a = adj[u][0], b = adj[u][1], c = adj[u][2];
    if (Query({u, a, b}) == 1) {
      remove(u, c);
    } else if (Query({u, a, c}) == 1) {
      remove(u, b);
    } else {
      remove(u, a);
    }
  }
  for (int i = 1; i <= 2 * N; ++i) {
    if (i < ans[i][0]) {
      Answer(i, ans[i][0]);
    }
  }
}
| # | 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... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |