#include <bits/stdc++.h>
using namespace std;
namespace std {
template <int D, typename T>
struct Vec : public vector<Vec<D - 1, T>> {
static_assert(D >= 1, "Dimension must be positive");
template <typename... Args>
Vec(int n = 0, Args... args) : vector<Vec<D - 1, T>>(n, Vec<D - 1, T>(args...)) {}
};
template <typename T>
struct Vec<1, T> : public vector<T> {
Vec(int n = 0, T val = T()) : std::vector<T>(n, val) {}
};
/* Example
Vec<4, int64_t> f(n, k, 2, 2); // = f[n][k][2][2];
Vec<2, int> adj(n); // graph
*/
template <class Fun>
class y_combinator_result {
Fun fun_;
public:
template <class T>
explicit y_combinator_result(T&& fun) : fun_(std::forward<T>(fun)) {}
template <class... Args>
decltype(auto) operator()(Args&&... args) {
return fun_(std::ref(*this), std::forward<Args>(args)...);
}
};
template <class Fun>
decltype(auto) y_combinator(Fun&& fun) {
return y_combinator_result<std::decay_t<Fun>>(std::forward<Fun>(fun));
}
/* Example
auto fun = y_combinator([&](auto self, int x) -> void {
self(x + 1);
});
*/
} // namespace std
void solve() {
vector<int> l(3), r(3);
cin >> r[0] >> r[1] >> r[2];
l[0] = l[1] = l[2] = 1;
int q; cin >> q;
auto ask = [&] (int x, int y, int z) {
cout << "? " << x << " " << y << " " << z << endl;
int res; cin >> res;
return res;
};
auto guess = [&] (int x, int y, int z) {
cout << "! " << x << " " << y << " " << z << endl;
};
auto get = [&] () {
int idx = 0;
for (int i = 1; i < 3; i++) if (r[i] - l[i] > r[idx] - l[idx]) idx = i;
return idx;
};
while (true) {
// for (int i = 0; i < 3; i++) {
// cout << l[i] << " " << r[i] << endl;
// }
// cout << "$\n";
int tmp = get();
if (r[tmp] - l[tmp] == 0) {
guess(l[0], l[1], l[2]);
return;
}
int mid = (l[tmp] + r[tmp]) / 2;
int oldL = l[tmp], oldR = r[tmp];
l[tmp] = mid;
r[tmp] = mid + 1;
// compare mid and mid + 1
int maximumValue = 0;
int side = 0;
// cout << tmp << "#\n";
vector<int> x(3);
for (x[0] = l[0]; x[0] <= r[0]; x[0]++) for (x[1] = l[1]; x[1] <= r[1]; x[1]++) for (x[2] = l[2]; x[2] <= r[2]; x[2]++) {
int res = ask(x[0], x[1], x[2]);
if (res > maximumValue) {
maximumValue = res;
if (x[tmp] == mid) side = 1;
else side = 2;
}
}
assert(side != 0);
l[tmp] = oldL;
r[tmp] = oldR;
if (side == 1) r[tmp] = mid;
else l[tmp] = mid + 1;
}
}
int32_t main() {
// ios_base::sync_with_stdio(0);
// cin.tie(0);
int t = 1;
// cin >> t;
while (t--) {
solve();
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |