← Home
/*
 * _|_|_|_|_|  _|_|_|_|    _|_|_|  _|_|_|_|_|  _|_|_|      _|_|
 *       _|    _|        _|                _|        _|  _|    _|
 *     _|      _|_|_|      _|_|          _|      _|_|        _|
 *   _|        _|              _|      _|            _|    _|
 * _|_|_|_|_|  _|        _|_|_|      _|        _|_|_|    _|_|_|_|
 */
 
#include <bits/stdc++.h>
 
std::mt19937 engine(0721);
 
template<class T, class = std::enable_if_t<std::is_integral_v<T>>>
T rand(T l, T r) {
  return std::uniform_int_distribution<T>(l, r)(engine);
}
 
int main() {
#ifdef LOCAL
  freopen("task.in", "r", stdin);
  freopen("task.out", "w", stdout);
  freopen("task.err", "w", stderr);
#endif
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
 
  int N;
  std::cin >> N;
 
#ifdef LOCAL
  std::vector<int> P(N);
  for (auto &v: P) { std::cin >> v; }
  std::iota(P.begin(), P.end(), 1);
  std::ranges::shuffle(P, engine);
  for (auto v: P) { std::cerr << v << ' '; }
  std::cerr << '\n';
#endif
 
  int tot = 0;
  auto Query = [&](int l, int r, int k) {
    if (l + 1 == r) { return 1; }
    tot++;
    std::cout << "? " << l + 1 << ' ' << r << ' ' << k << std::endl;
#ifdef LOCAL
    std::set<int> st;
    for (int i = l; i < r; i++) { st.emplace(P[i] / k); }
    return (int) st.size();
#else
    int x;
    std::cin >> x;
    return x;
#endif
  };
 
  auto Answer = [&](int x) {
    std::cout << "! " << x + 1 << std::endl;
#ifdef LOCAL
    std::cerr << (P[x] == 1 ? "Accepted!\n" : "Wrong Answer!\n");
    std::cerr << "total: " << tot << '\n';
#endif
  };
 
  auto Match = [&](int l, int r) { return r - l - Query(l, r, 2); };
 
  int p1 = -1, p2 = N + 1;
  auto CheckPref = [&](int x) {
    if (x <= p1) { return true; }
    if (p2 <= x) { return false; }
    bool f = 1 < x ? Query(0, x, N) == 1 : Query(x, N, N) != 1;
    if (f) {
      p1 = std::max(p1, x);
    } else {
      p2 = std::min(p2, x);
    }
    return f;
  };
 
  int L = 0, R = N - 1, all = (N + 1) / 2 - 1;
  while (L < R) {
    int M = (L + R + 1) >> 1;
    int ml = Match(0, M), mr = Match(M, N);
    int vl = mr - ml - all + M, vr = ml - mr - all + (N - M);
    std::cerr << M << ' ' << vl << ' ' << vr << '\n';
    if (N & 1) {
      if (vl == 1) {
        R = M - 1;
      } else {
        L = M;
      }
    } else {
      if (vl == 2 || (vl == 1 && CheckPref(M))) {
        R = M - 1;
      } else {
        L = M;
      }
    }
  }
  Answer(L);
 
  return 0;
}