| #include <bits/stdc++.h> |
| using namespace std; |
| using ll = long long; |
|
|
| void solve() { |
| int n; |
| cin >> n; |
| vector<ll> d1(n+1, 0), da(n+1, 0); |
| |
| for (int i = 2; i <= n; ++i) { |
| cout << "? 1 " << i << endl; |
| cout.flush(); |
| cin >> d1[i]; |
| } |
| d1[1] = 0; |
| |
| int a = 1; |
| for (int i = 2; i <= n; ++i) { |
| if (d1[i] > d1[a]) a = i; |
| } |
| |
| for (int i = 1; i <= n; ++i) { |
| if (i != a) { |
| cout << "? " << a << " " << i << endl; |
| cout.flush(); |
| cin >> da[i]; |
| } |
| } |
| da[a] = 0; |
| ll D = d1[a]; |
| |
| vector<ll> x(n+1), h(n+1); |
| for (int i = 1; i <= n; ++i) { |
| x[i] = (d1[i] - da[i] + D) / 2; |
| h[i] = (d1[i] + da[i] - D) / 2; |
| } |
| |
| map<ll, vector<int>> group; |
| for (int i = 1; i <= n; ++i) { |
| group[x[i]].push_back(i); |
| } |
| |
| vector<int> path; |
| for (int i = 1; i <= n; ++i) { |
| if (h[i] == 0) path.push_back(i); |
| } |
| sort(path.begin(), path.end(), [&](int u, int v) { return x[u] < x[v]; }); |
| vector<tuple<int,int,ll>> edges; |
| |
| for (size_t i = 0; i+1 < path.size(); ++i) { |