Submission #1169821

#TimeUsernameProblemLanguageResultExecution timeMemory
1169821nguyentunglamWorm Worries (BOI18_worm)C++20
10 / 100
370 ms416 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...