File size: 2,558 Bytes
14c9c2b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | #include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
int n, k;
scanf("%d %d", &n, &k);
vector<vector<ll>> cache(n+1, vector<ll>(n+1));
vector<vector<bool>> known(n+1, vector<bool>(n+1, false));
int query_count = 0;
auto get_value = [&](int i, int j) -> ll {
if (known[i][j]) return cache[i][j];
printf("QUERY %d %d\n", i, j);
fflush(stdout);
ll val;
scanf("%lld", &val);
cache[i][j] = val;
known[i][j] = true;
query_count++;
return val;
};
// Sample diagonal and anti-diagonal
vector<ll> samples;
for (int i = 1; i <= n; i++) {
samples.push_back(get_value(i, i));
}
for (int i = 1; i <= n; i++) {
int j = n + 1 - i;
if (i != j) {
samples.push_back(get_value(i, j));
}
}
sort(samples.begin(), samples.end());
ll min_val = samples[0];
ll max_val = samples.back();
// Count elements <= mid
auto count_le = [&](ll mid) -> ll {
int col = n;
ll total = 0;
for (int row = 1; row <= n; row++) {
while (col >= 1) {
ll v = get_value(row, col);
if (v > mid) {
col--;
} else {
break;
}
}
total += col;
if (col == 0) break; // remaining rows will also have 0
}
return total;
};
// Binary search on sampled values
int idx_low = 0, idx_high = (int)samples.size() - 1;
int target_idx = idx_high;
while (idx_low < idx_high) {
int mid_idx = (idx_low + idx_high) / 2;
ll cnt = count_le(samples[mid_idx]);
if (cnt >= k) {
idx_high = mid_idx;
target_idx = mid_idx;
} else {
idx_low = mid_idx + 1;
}
}
ll ans;
if (target_idx == 0) {
ans = samples[0];
} else {
ll L = samples[target_idx-1];
ll R = samples[target_idx];
if (R == L) {
ans = L;
} else {
ll low = L + 1, high = R;
while (low < high) {
ll mid = low + (high - low) / 2;
ll cnt = count_le(mid);
if (cnt >= k) {
high = mid;
} else {
low = mid + 1;
}
}
ans = low;
}
}
printf("DONE %lld\n", ans);
fflush(stdout);
return 0;
} |