intquery(int a, int b){ cout << "? " << a << ' ' << b << endl;
cin >> a; return a; }
voideachT(){ int n; cin >> n;
vector<int> vis(n + 1); vector<pair<int, int>> res; auto solve = [&](auto&& self, int a, int b) -> void { int x = query(a, b); if (x == a) { res.emplace_back(a, b); vis[x] = 1; } elseif (!vis[x]) { self(self, x, b); self(self, a, x); } else { self(self, a, x); } };
vis[1] = 1; for (int i = 2; i <= n; i++) { if (!vis[i]) { solve(solve, i, 1); } }
cout << "! "; for (auto& [a, b] : res) { cout << a << ' ' << b << ' '; } cout << endl; }
voidanswer(int a, int b){ cout << "! " << a << " " << b << endl; return; }
voideachT(){ int n; cin >> n;
int a1 = query(1), an = query(n);
if (a1 == an + 2) { // all left int a = an, b = query(n - a / 2);
if (a & 1) { answer(n - (a / 2 + (b + 1) / 2), n - (a / 2 - (b - 1) / 2)); } else { answer(n - (a / 2 + b / 2), n - (a / 2 - b / 2)); } }
if (an == a1 + 2) { // all right int a = a1, b = query(1 + a / 2);
if (a & 1) { answer(1 + (a / 2 + (b + 1) / 2), 1 + (a / 2 - (b - 1) / 2)); } else { answer(1 + (a / 2 + b / 2), 1 + (a / 2 - b / 2)); } }
if (a1 == an + 1) { // opposite answer((n + 1) / 2, n - an + n / 2); }
if (an == a1 + 1) { answer((n + 1) / 2, 1 + a1 - n / 2); }
if (a1 == an) { if (a1 <= n / 2) { int l = 1, r = (n + 1) / 2; while (l <= r) { int mid = (l + r) >> 1; if (query(mid) == a1) l = mid + 1; else r = mid - 1; } answer(r, r + n - a1); } else { int l = 1, r = (n + 1) / 2; while (l <= r) { int mid = (l + r) >> 1; if (query(mid) == n - a1) r = mid - 1; else l = mid + 1; } answer(l, l + n - a1); } } }
basic_string<int> solve(basic_string<int>& a){ if (a.size() < 2) return a;
constint n = a.size(); int pos = rng() % n; // 否则会被卡成 n^2 while (query(a[pos]) != '=') {}
basic_string<int> le, ge; for (int i = 0; i < n; ++i) { if (i == pos) continue; if (query(a[i]) == '<') { le += a[i]; } else { ge += a[i]; } query(a[pos]); }
int res = 0, pos = n % k; res ^= query(1); res ^= query(1 + pos / 2); for (int i = pos + 1; i + k - 1 <= n; i += k) { res ^= query(i); } cout << "! " << res << endl; }
constexprint N = 5008; vector<int> E[N]; int p[N], h[N];
voiddfs(int u){ for (auto v : E[u]) { if (v == p[u]) continue; p[v] = u; dfs(v); h[u] = max(h[u], h[v] + 1); } }
intfind(int u){ vector<int> a; for (auto& v : E[u]) { if (v == p[u] || h[v] < B) continue; a.push_back(v); } if (a.empty()) { return u; } for (auto& v : a) { if (v == a.back() || query(v) == 1) { returnfind(v); } } }
voideachT(){ int n; cin >> n;
for (int i = 0; i <= n; ++i) { E[i].clear(); p[i] = 0; h[i] = 0; }
for (int i = 2; i <= n; ++i) { int u, v; cin >> u >> v; E[u].push_back(v); E[v].push_back(u); }
dfs(1);
for (int u = 1; u <= n; ++u) { if (h[u] == 0) { // u 是叶子 for (int i = 0; i < B; ++i) { if (query(u) == 1) { answer(u); return; } } break; } }
vector<int> a; for (int u = find(1); u != 0; u = p[u]) { a.push_back(u); } reverse(a.begin(), a.end());
int l = 0, r = a.size() - 1; while (l < r) { int mid = (l + r + 1) / 2; if (query(a[mid]) == 1) { l = mid; } else { r = mid - 1; l = max(0, l - 1); r = max(0, r - 1); } }