Submission #539445

#TimeUsernameProblemLanguageResultExecution timeMemory
539445skittles1412Worm Worries (BOI18_worm)C++17
0 / 100
3 ms4176 KiB
#include "bits/extc++.h"

using namespace std;

template <typename T>
void dbgh(const T& t) {
	cerr << t << endl;
}

template <typename T, typename... U>
void dbgh(const T& t, const U&... u) {
	cerr << t << " | ";
	dbgh(u...);
}

#ifdef DEBUG
#define dbg(...)                                           \
	cerr << "L" << __LINE__ << " [" << #__VA_ARGS__ << "]" \
		 << ": ";                                          \
	dbgh(__VA_ARGS__)
#else
#define cerr   \
	if (false) \
	cerr
#define dbg(...)
#endif

#define endl "\n"
#define long int64_t
#define sz(x) int((x).size())

namespace s1 {

bool solve(int n, int m, int k, int q) {
#ifdef GEN
	int ogrid[n];
	mt19937 cowng(chrono::steady_clock::now().time_since_epoch().count());
	for (auto& a : ogrid) {
		a = int(cowng() % int(1e9));
	}
#endif
	if (m != 1 || k != 1) {
		return false;
	}
	int cache[n];
	memset(cache, -1, sizeof(cache));
	auto queryuc = [&](int i) -> int {
#ifndef GEN
		cout << "? " << i + 1 << " 1 1" << endl;
		int x;
		cin >> x;
		return x;
#else
		return ogrid[i];
#endif
	};
	auto query = [&](int i) -> int {
		if (!(0 <= i && i < n)) {
			return -1e9;
		}
		if (cache[i] != -1) {
			return cache[i];
		}
		static int qcnt = 0;
		qcnt++;
		assert(qcnt <= q);
		return cache[i] = queryuc(i);
	};
	auto answer = [&](int i) -> void {
		cout << "! " << i + 1 << " 1 1" << endl;
		exit(0);
	};
	auto check = [&](int i) -> void {
		if (query(i) >= max(query(i - 1), query(i + 1))) {
			dbg(query(i), query(i - 1), query(i + 1));
			answer(i);
		}
	};
	int l = 0, r = n - 1;
	while ((r - l + 1) > 3) {
		int madd = (r - l + 1) / 3, m1 = l + madd, m2 = r - madd;
		dbg(l, r, m1, m2);
		int a = query(m1), b = query(m2);
		if (a < b) {
			l = m2;
		} else if (a == b) {
			l = m1;
			r = m2;
		} else if (a > b) {
			r = m1;
		}
	}
	if (l == r) {
		answer(l);
	} else if (l + 1 == r) {
		check(l);
		answer(r);
	} else {
		check(l + 1);
		check(l);
		answer(r);
	}
	return true;
}

}  // namespace s1

void solve() {
	int n, m, k, q;
	cin >> n >> m >> k >> q;
	s1::solve(n, m, k, q);
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.exceptions(ios::failbit);
	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...