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):
        self.x = x
        self.d = ask(x, 0)
    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)

class g(object):
    def __init__(self, y):
        self.y = y
        self.d = ask(0, 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)

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 = -10**8, 10**8
N = int(input())
x = findMin(f, L, R)
y = findMin(g, L, R)
res(x, y)