#include <iostream>
#include <vector>
#include <map>
using namespace std;
vector <int> v;
int q;
int l, r, mid;
int gr_left(int a, int b) {
cerr << "Calculating gr_left with a: " << a << ", b: " << b << endl;
return int(0.382 * (b - a)) + a;
}
int gr_right(int a, int b) {
cerr << "Calculating gr_right with a: " << a << ", b: " << b << endl;
return int(0.618 * (b - a)) + a;
}
int ask(int i) {
if(q == 0) {
cout << r-mid << ' ' << mid-l << endl;
exit(0);
}
q--;
cout << "? " << i+1 << " 1 1" << endl;
cin >> v[i];
return v[i];
}
int main() {
int n, m, k;
cin >> n >> m >> k >> q;
v.resize(n, -1);
l = 0;
r = n - 1;
int a, b;
a = gr_left(0, n-1);
b = gr_right(0, n-1);
if(a == b) {
b++;
}
ask(a);
ask(b);
bool next_right = false;
if(v[a] < v[b]) {
l = a;
mid = b;
next_right = true;
} else {
r = b;
mid = a;
next_right = false;
}
int curr;
while(r - mid > 1 || mid - l > 1) {
if(next_right) {
curr = gr_right(l, r);
ask(curr);
if(v[curr] > v[mid]) {
l = mid;
mid = curr;
next_right = true;
} else {
r = curr;
next_right = false;
}
} else {
curr = gr_left(l, mid);
ask(curr);
if(v[curr] > v[mid]) {
r = mid;
mid = curr;
next_right = false;
} else {
l = curr;
next_right = true;
}
}
}
if(mid > 0 && v[mid-1] == -1) {
ask(mid-1);
}
if(mid < n-1 && v[mid+1] == -1) {
ask(mid+1);
}
if(v[mid] >= v[mid-1] && v[mid] >= v[mid+1]) {
cout << "! " << mid + 1 << " 1 1" << endl;
} else if(v[mid-1] >= v[mid]) {
cout << "! " << mid - 1 + 1 << " 1 1" << endl;
} else {
cout << "! " << mid + 1 + 1 << " 1 1" << endl;
}
return 0;
}