# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1190113 | Ghulam_Junaid | Minerals (JOI19_minerals) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#include "grader.cpp"
using namespace std;
const int MXN = 1e5 + 100;
int n, lo[MXN], hi[MXN];
vector<int> a, b, vec[MXN];
void Solve(int nn){
n = nn;
int D = 0;
for (int i = 1; i <= 2 * n; i ++){
if (Query(i) == D){
b.push_back(i);
Query(i);
}
else{
D++;
a.push_back(i);
}
}
for (int i : a)
Query(i);
for (int i : a){
int lb = lower_bound(b.begin(), b.end(), i) - b.begin();
lo[i] = lb - 1;
hi[i] = n - 1;
}
for (int i : a){
if (hi[i] - lo[i] <= 1) continue;
int mid = (lo[i] + hi[i]) / 2;
vec[mid].push_back(i);
}
for (int it = 0; it < 16; it ++){
if (it % 2 == 0){
for (int i = 0; i < n; i ++){
int D = Query(b[i]);
for (int x : vec[i]){
if (Query(x) == D)
hi[x] = i;
else
lo[x] = i;
int mid = (lo[x] + hi[x]) / 2;
vec[mid].push_back(x);
}
vec[i].clear();
}
}
else{
int D = n;
for (int i = n - 1; i >= 0; i --){
for (int x : vec[i]){
if (Query(x) == D)
hi[x] = i;
else
lo[x] = i;
int mid = (lo[x] + hi[x]) / 2;
vec[mid].push_back(x);
}
vec[i].clear();
D = Query(b[i]);
}
}
}
for (int i : a)
Answer(i, b[hi[i]]);
}