#include <iostream>
#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <vector>
#include <string>
#include <fstream>
#include <algorithm>
#include <cstring>

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vi;
typedef pair<int,int> ii;
typedef vector< ii > vii;
///////////////////////////////UTIL/////////////////////////////////
#define ALL(x) (x).begin(),x.end()
#define CLEAR0(v) memset(v, 0, sizeof(v))
#define CLEAR(v, x) memset(v, x, sizeof(v))
#define COPY(a, b) memcpy(a, b, sizeof(a))
#define CMP(a, b) memcmp(a, b, sizeof(a))
#define REP(i,n) for(int i = 0; i<n; i++)
#define REPP(i,a,n) for(int i = a; i<n; i++)
#define REPD(i,n) for(int i = n-1; i>-1; i--)
#define REPDP(i,a,n) for(int i = n-1; i>=a; i--)

int n = 200, last = -10000;
bool ver[210][210];
int mem[210][210];
int x = 0, y = 0;
bool lineQuery = false, colQuery = false;
int hi = 0, lo = 0, mid, ans;
int MXCOL = 200, MXLINE = 200;
		
void resetBB(int LO, int HI){
	hi = ans = HI;
	lo = LO;
}

int query(int X, int Y){
	if(!ver[X][Y]){
		cout << X << " " << Y << endl;
		cout.flush();
		cin >> mem[X][Y];
	}
	return mem[X][Y];
}

int main(){
	CLEAR0(ver);
	while(last != 0){
			
		if(hi-lo > 1){
			mid = (hi+lo)/2;
			//cout << " HI " << hi << " LO " << lo << " MID " << mid << " ANS " << " MXLINE " << MXLINE << " MXCOL " << MXCOL << " ANS " << ans << endl;
		
			if(colQuery) last = query(mid, y);
			else if(lineQuery) last = query(x, mid);
			if(last > 0){ hi = mid; ans = mid; }
			else if(last < 0){ lo = mid; }
		}
		else{
			if(!lineQuery){
				resetBB(y, MXCOL);
				lineQuery = true;
			}
			else if(!colQuery){
				MXCOL = ans;
				resetBB(x, MXLINE);
				colQuery = true;
			}
			else{
				MXLINE = ans;
				lineQuery = colQuery = false;
				x++;
				y++;
			}
		}
	}
}