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),(1,2),(1,3),(2,2),(2,3),(2,4),(100,100),(102,3847)] def query(xl,xr,yl,yr): print('?',xl,xr,yl,yr,flush=True) #assert 0 <= xl <= xr <= 1000000 and 0 <= yl <= yr <= 1000000 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 = ll-1,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 #print(p) left = 0 while 1: l,r = left-1,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 left > 1000000 or query(left,1000000,p,p) == 0: break if ll > 1000000 or query(0,1000000,ll,1000000) == 0: break print('!',len(ans)) for i,j in ans: print(i,j)