import collections,sys,math,functools,operator,itertools,bisect,heapq,decimal,string,time,random #sys.setrecursionlimit(10**9) #sys.set_int_max_str_digits(0) input = sys.stdin.readline #alist = list(map(int,input().split())) #alist = [] #s = input() #n,m = map(int,input().split()) #for i in range(n): # alist.append(list(map(int,input().split()))) #b = [(5,5),(1,1),(2,2)] def query(xl,xr,yl,yr): print('?',xl,xr,yl,yr,flush=True) z = int(input()) return z z = 0 for i,j in b: if xl <= i <= xr and yl <= j <= yr: z = 1 return z ans = [] ll = 0 while 1: l,r = 0,1000000+1 while r-l > 1: mid =(l+r)//2 if query(0,1000000,ll,mid): r = mid else: l = mid ll = r+1 p = r left = 0 while 1: l,r = 0,1000000 while r-l > 1: mid = (l+r)//2 if query(left,mid,p,p): r = mid else: l = mid ans.append((r,p)) left = r+1 if query(left,1000000,p,p) == 0: break if query(0,1000000,ll,1000000) == 0: break print('!',len(ans)) for i,j in ans: print(i,j)