#include<bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)n; i++)
#define rep1(i, n) for (int i = 1; i <= (int)(n); i++)
vector<vector<int>> G1, G2;
int N, K, Q, T, r1, r2;
int dep1[1000009], dep2[1000009], par1[30][1000009], par2[30][1000009];
vector<int> sorted;
void dfs1(int now) {
sorted.push_back(now);
for (int nex : G1[now]) {
dep1[nex] = dep1[now] + 1; par1[0][nex] = now; dfs1(nex);
}
}
void dfs2(int now) {
for (int nex : G2[now]) {
dep2[nex] = dep2[now] + 1; par2[0][nex] = now; dfs2(nex);
}
}
int prevs1(int pos, int d) {
rep(i, 30) if ((d >> i) & 1) pos = par1[i][pos];
return pos;
}
int prevs2(int pos, int d) {
rep(i, 30) if ((d >> i) & 1) pos = par2[i][pos];
return pos;
}
int lca1(int u, int v) {
if (dep1[u] > dep1[v]) swap(u, v);
v = prevs1(v, dep1[v] - dep1[u]);
if (u == v) return u;
for (int i = 29; i >= 0; i--) {
if (par1[i][u] != par1[i][v]) {
u = par1[i][u]; v = par1[i][v];
}
}
return par1[0][u];
}
int lca2(int u, int v) {
if (dep2[u] > dep2[v]) swap(u, v);
v = prevs2(v, dep2[v] - dep2[u]);
if (u == v) return u;
for (int i = 29; i >= 0; i--) {
if (par2[i][u] != par2[i][v]) {
u = par2[i][u]; v = par2[i][v];
}
}
return par2[0][u];
}
int main() {
cin >> N >> K >> Q >> T;
G1.resize(N+1); G2.resize(N+1);
rep1(i, N) {
int p; cin >> p;
if (p == -1) {
r1 = i; dep1[r1] = 0;
}
else G1[p].push_back(i);
}
rep1(i, N) {
int p; cin >> p;
if (p == -1) {
r2 = i; dep2[r2] = 0;
}
else G2[p].push_back(i);
}
dfs1(r1); dfs2(r2);
// ダブリング
rep(i, 29) rep1(j, N) {
par1[i+1][j] = par1[i][par1[i][j]];
par2[i+1][j] = par2[i][par2[i][j]];
}
// 質疑応答
rep(i, K) {
cout << sorted[i];
if (i == K - 1) cout << endl;
else cout << " ";
}
rep1(i, K-1) {
cout << "? " << r1 << " " << sorted[i] << endl;
}
cout << "!" << endl;
vector<int> d(N+1, 0), ans(T);
rep1(i, K-1) {
int a, b, c; cin >> a >> d[sorted[i]] >> b >> c;
}
rep(i, T) {
int p, q; cin >> p >> q;
ans[i] = d[p] + d[q] - d[lca1(p, q)] * 2;
}
rep(i, T) cout << ans[i] << " " << ans[i] << endl;
}