# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
778652 | benjaminkleyn | The Big Prize (IOI17_prize) | C++17 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "prize.h"
#include <bits/stdc++.h>
using namespace std;
bool asked[200000] = {false};
int L[200000], R[200000];
map<int, set<int>> queries;
bool Ask(int i)
{
if (asked[i]) return L[i] + R[i] == 0;
asked[i] = true;
vector<int> res = ask(i);
L[i] = res[0], R[i] = res[1];
if (queries.find(L[i] + R[i]) == queries.end())
queries[L[i] + R[i]] = set<int>();
queries[L[i] + R[i]].insert(i);
return L[i] + R[i] == 0;
}
int Find(int l, int r)
{
if (Ask(l)) return l;
if (Ask(r)) return r;
if (l + 1 == r)
return -1;
for (auto [x, s] : queries)
{
auto it1 = s.upper_bound(l), it2 = s.lower_bound(r);
if (it1 == s.begin() || it2 == s.end()) continue;
if (L[*prev(it1)] == L[*it2]) return -1;
}
int m = (l + r) / 2;
int x = Find(l, m);
if (x >= 0) return x;
int y = Find(m, r);
if (y >= 0) return y;
return -1;
}
int find_best(int r, int l = 0)
{
return Find(0, n - 1);
}