#include #include #include #include #include #include #include #include #include #define ll long long #define ld long double using namespace std; inline void setmin(int &x, int y) { if (y < x) x = y; } inline void setmax(int &x, int y) { if (y > x) x = y; } inline void setmin(ll &x, ll y) { if (y < x) x = y; } inline void setmax(ll &x, ll y) { if (y > x) x = y; } const int N = 100000; const int inf = (int)1e9 + 1; const int MOD = (int)1e9 + 7; const ld pi = atan2(0, -1); int ask(int x, int y) { cout << 1 << " " << x << " " << y << endl; int res; cin >> res; return res; } void answer(int x, int y) { cout << 2 << " " << x << " " << y << endl; exit(0); } int main() { //freopen("a.in", "r", stdin); //freopen("a.out", "w", stdout); ios_base::sync_with_stdio(0); cin.tie(0); cout.precision(20); cout << fixed; //ll TL = 0.95 * CLOCKS_PER_SEC; //clock_t time = clock(); int n, k, v; cin >> n >> k >> v; if (n * n <= k) { for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) if (ask(i, j) == v) answer(i, j); answer(-1, -1); } for (int i = 1; i <= n; i++) { bool inc = (ask(i, 1) < ask(i, 2)); if (inc) { int l = 0, r = n, mid; while (r - l > 1) { mid = (l + r) / 2; ask(i, mid) < v ? l = mid : r = mid; } if (ask(i, r) == v) answer(i, r); } else { int l = 1, r = n + 1, mid; while (r - l > 1) { mid = (l + r) / 2; ask(i, mid) < v ? r = mid : l = mid; } if (ask(i, l) == v) answer(i, l); } } answer(-1, -1); return 0; }