#include <stdio.h>
#include <stack>
using namespace std;

int polje[200][200];
struct str{
	int x[2], y[2];
};

void polnjenje(int x, int y, int n){//if v<0->n=-1; if(v>0 -> n=1
	if(n > 0){
		for( ; x<200; x++){
			if(polje[x][y] > 0) break;
			for( ; y<200; y++){
				if(polje[x][y]>0)	break;
				polje[x][y] = n;
			}
		}
	}
	else{
		for( ; x >= 0; x--){
			if(polje[x][y] < 0) break;
			for( ; y >= 0; y--){
				if(polje[x][y]>0)	break;
				polje[x][y] = n;
			}
		}
	}
	return;
}


int main(){
	int x=0, y=0, v=100;
	stack<str> rek;	
	str s, s1;
	s.x[0] = 0; s.x[1] = 200; s.y[0] = 0; s.y[1] = 200;
	for(int x1 = 0; x1 < 200; x1++)
		for(int y1 = 0; y1 < 200; y1++)
			polje[x][y] = 0;
	rek.push(s);

	while(!rek.empty()){
		s = rek.top();
		rek.pop();
		if(s.x[0] == s.x[1]-1 && s.y[0] == s.y[1]-1){
			for(int x = s.x[0]; x != s.x[1]; x++)
				for(int y = s.y[0]; y != s.y[1]; y++)
					if(polje[x][y] != 0){
						printf("%i %i\n", x, y);
						fflush(stdout);
						scanf("%i", &v);
						if(v==0)return 0;
						if(v>0)	polnjenje(x, y, 1);
						else polnjenje(x, y, -1);
					}
		}
		else{
			x=(s.x[0]+s.x[1])/2;
			y=(s.y[0]+s.y[1])/2;
			printf("%i %i\n", x, y);
			fflush(stdout);
			scanf("%i", &v);
			if(v==0) return 0;
			s1 = s;//nastanejo 3 novi kvadrati
			s.x[0] = x; s.y[1] = y;
			rek.push(s);
			s.x[0] = s1.x[0]; s.x[1] = x;
			s.y[0] = y; s.y[1] = s1.y[1];
			rek.push(s);
			if(v>0){
				polnjenje(x, y, 1);
				
				s.y[0] = s1.y[0]; s.y[1] = s1.y[1];
				rek.push(s);
			}
			else{
				polnjenje(x, y, -1);
				s.x[0] = x; s.x[1] = s1.x[1];
				rek.push(s);
			}
		}
	}

	return 0;
}