#include using namespace std; int main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); int N = 1'000'000; auto query = [&](int lx,int rx,int ly,int ry) -> bool { if(lx == rx || ly == ry) return false; rx--; ry--; cout << "? " << lx << " " << rx << " " << ly << " " << ry << endl; int ret; cin >> ret; assert(ret != -1); return ret; }; auto output = [&](vector> P) -> void { cout << "!" << P.size() << endl; for(auto [x,y] : P) cout << x << " " << y << endl; }; queue> Q; Q.push({0,N+1,0,N+1}); vector> answer; while(Q.size()){ auto [lx,rx,ly,ry] = Q.front(); Q.pop(); if(lx+1 == rx && ly+1 == ry){ answer.push_back({lx,ly}); continue; } int mx = (lx+rx)/2,my = (ly+ry)/2; if(query(lx,mx,ly,my)) Q.push({lx,mx,ly,my}); if(query(lx,mx,my,ry)) Q.push({lx,mx,my,ry}); if(query(mx,rx,ly,my)) Q.push({mx,rx,ly,my}); if(query(mx,rx,my,ry)) Q.push({mx,rx,my,ry}); } output(answer); }