#にぶたん4000回以内にプレゼントが存在する行の集合を特定できるか? #二つに分けた領域両方について質問すれば、今後調べる必要のない範囲はわかる gyou_sonzai=[[0,1000001]] #領域は半開区間で持つ gyou_sonzai_kakutei=[] while len(gyou_sonzai)>0: z=gyou_sonzai.pop(-1) small=False big=False kyoukai=(z[0]+z[1])//2 print("?",0,1000000,z[0],kyoukai-1) a=int(input()) small=True if a==1 else 0 print("?",0,1000000,kyoukai,z[1]-1) b=int(input()) big=True if b==1 else 0 if small: if kyoukai-z[0]==1: gyou_sonzai_kakutei.append(z[0]) else: gyou_sonzai.append([z[0],kyoukai]) if big: if z[1]-kyoukai==1: gyou_sonzai_kakutei.append(kyoukai) else: gyou_sonzai.append([kyoukai,z[1]]) ans=[] #ここから列を確定していく for gyou in gyou_sonzai_kakutei: retu_sonzai=[[0,1000001]] while len(retu_sonzai)>0: z=retu_sonzai.pop(-1) small=False big=False kyoukai=(z[0]+z[1])//2 print("?",z[0],kyoukai-1,gyou,gyou) a=int(input()) small=True if a==1 else 0 print("?",kyoukai,z[1]-1,gyou,gyou) b=int(input()) big=True if b==1 else 0 if small: if kyoukai-z[0]==1: ans.append([z[0],gyou]) else: retu_sonzai.append([z[0],kyoukai]) if big: if z[1]-kyoukai==1: ans.append([kyoukai,gyou]) else: retu_sonzai.append([kyoukai,z[1]]) print("!",len(ans)) for i in ans: print(*i)