from collections import defaultdict, deque, Counter from functools import cache # import copy from itertools import combinations, permutations, product, accumulate, groupby, chain from more_itertools import distinct_permutations from heapq import heapify, heappop, heappush, heappushpop import math import bisect from pprint import pprint from random import randint, shuffle, randrange from sortedcontainers import SortedSet, SortedList, SortedDict import sys # sys.setrecursionlimit(2000000) input = lambda: sys.stdin.readline().rstrip('\n') inf = float('inf') mod1 = 10**9+7 mod2 = 998244353 def ceil_div(x, y): return -(-x//y) ################################################# memo = {} def ask(x, y): if (x, y) not in memo: print(1, x, y, flush=True) memo[(x, y)] = int(input()) return memo[(x, y)] def res(x, y): print(2, x, y, flush=True) exit() class f(object): def __init__(self, x): class g(object): def __init__(self, y): self.y = y self.d = ask(x, y) def __eq__(self, other): if not isinstance(other, g): return NotImplemented return self.d == other.d def __lt__(self, other): if not isinstance(other, g): return NotImplemented return self.d < other.d def __ne__(self, other): return not self.__eq__(other) def __le__(self, other): return self.__lt__(other) or self.__eq__(other) def __gt__(self, other): return not self.__le__(other) def __ge__(self, other): return not self.__lt__(other) self.x = x self.y = findMin(g, L, R) self.d = ask(x, self.y) def __eq__(self, other): if not isinstance(other, f): return NotImplemented return self.d == other.d def __lt__(self, other): if not isinstance(other, f): return NotImplemented return self.d < other.d def __ne__(self, other): return not self.__eq__(other) def __le__(self, other): return self.__lt__(other) or self.__eq__(other) def __gt__(self, other): return not self.__le__(other) def __ge__(self, other): return not self.__lt__(other) def findMin(f, l, r): while r-l >= 3: c1 = l+(r-l)//3 c2 = r-(r-l)//3 if f(c1) < f(c2): r = c2 else: l = c1 return min(list(range(l, r+1)), key=lambda k: f(k)) def findMax(f, l, r): while r-l >= 3: c1 = l+(r-l)//3 c2 = r-(r-l)//3 if f(c1) > f(c2): r = c2 else: l = c1 return max(list(range(l, r+1)), key=lambda k: f(k)) L, R = -2, 2 N = int(input()) x = findMin(f, L, R) res(x, f(x).y)