//Code by Patcas Csaba

#include <vector>
#include <string> 
#include <set> 
#include <map> 
#include <queue> 
#include <bitset> 
#include <stack>
#include <list>

#include <numeric> 
#include <algorithm> 

#include <cstdio>
#include <fstream>
#include <iostream> 
#include <sstream> 
#include <iomanip>

#include <cctype>
#include <cmath> 
#include <ctime>
#include <cassert>

using namespace std;

#define LL long long
#define PII pair <int, int>
#define VB vector <bool>
#define VI vector <int>
#define VD vector <double>
#define VS vector <string>
#define VPII vector <pair <int, int> >
#define VVI vector < VI >
#define VVB vector < VB >

#define FORN(i, n) for(int i = 0; i < (n); ++i)
#define FOR(i, a, b) for(int i = (a); i <= (b); ++i)
#define FORD(i, a, b) for(int i = (a); i >= (b); --i)
#define REPEAT do{ 
#define UNTIL(x) }while(!(x)); 

#define SZ size()
#define BG begin() 
#define EN end() 
#define CL clear()
#define X first
#define Y second
#define RS resize
#define PB push_back
#define MP make_pair
#define ALL(x) x.begin(), x.end()

#define IN_FILE "a.in"
#define OUT_FILE "a.out"

#define INF 2100000000

VVI a(200, VI(200, INF));

int main()
{
	//Read data	

	//Solve
  int i = 0;
  int down = 0, up = 199;
  while (down <= up)
  {
    int j = (down + up) / 2;
    if (a[i][j] != INF) break;
    cout << i << " " << j << endl;
    cout.flush();
    cin >> a[i][j];
    if (a[i][j] == 0) return 0;
    if (a[i][j] < 0) down = j + 1;
    else up = j - 1;
  }

  FOR(i, 1, 199)
  {
    int down = 0, up = 199;
    while (down <= up)
    {
      int j = (down + up) / 2;
      if (a[i][j] != INF) break;
      if (a[i - 1][j] != INF && a[i - 1][j] > 0)
      {
        up = j - 1;
        continue;
      }
      cout << i << " " << j << endl;
      cout.flush();
      cin >> a[i][j];
      if (a[i][j] == 0) return 0;
      if (a[i][j] < 0) down = j + 1;
      else up = j - 1;
    }
  }

	//Write data


	return 0;
}