#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) + 0.5) + a;
}
int gr_right(int a, int b) {
cerr << "Calculating gr_right with a: " << a << ", b: " << b << endl;
return int(0.618 * (b - a) + 0.5) + a;
}
int ask(int i) {
if(v[i] != -1) {
cerr << "Value already known for index: " << i << ", value: " << v[i] << endl;
return v[i];
}
cerr << "l: " << l << ", mid: " << mid << ", r: " << r << ", asking for index: " << i << endl;
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 && r - l > 2) {
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]) {
ask(mid-2);
if(v[mid-2] <= v[mid-1]) {
cout << "! " << mid - 1 + 1 << " 1 1" << endl;
} else {
cout << "! " << mid - 2 + 1 << " 1 1" << endl;
}
} else {
ask(mid+2);
if(v[mid+2] <= v[mid+1]) {
cout << "! " << mid + 1 + 1 << " 1 1" << endl;
} else {
cout << "! " << mid + 2 + 1 << " 1 1" << endl;
}
}
return 0;
}