#include #include using namespace std; using i32 = int; using i64 = long long; using i128 = __int128_t; using f64 = double; using p2 = pair; using el = tuple; using mint = atcoder::modint; void _main(); int main() { cin.tie(0); ios::sync_with_stdio(false); cout << fixed << setprecision(18); _main(); } void _main() { i64 tt; cin >> tt; for (;tt--;) { i64 n, m, k, p; cin >> n >> m >> k >> p; vector a(n), b(m); vector> v1(k), v2(k); vector s(k); for (i64 i = 0; i < n; i++) { cin >> a[i].first; } for (i64 i = 0; i < n; i++) { cin >> a[i].second; a[i].second--; v1[a[i].second].push_back(i); } for (i64 i = 0; i < m; i++) { cin >> b[i].first; } for (i64 i = 0; i < m; i++) { cin >> b[i].second; b[i].second--; v2[b[i].second].push_back(i); } for (i64 i = 0; i < k; i++) { cin >> s[i]; } vector ord1(n), ord2(m); for (i64 i = 0; i < n; i++) ord1[i] = i; for (i64 i = 0; i < m; i++) ord2[i] = i; sort(ord1.begin(), ord1.end(), [&](i64 i, i64 j){return a[i].first < a[j].first;}); sort(ord2.begin(), ord2.end(), [&](i64 i, i64 j){return b[i].first < b[j].first;}); for (i64 i = 0; i < k; i++) { sort(v1[i].begin(), v1[i].end(), [&](i64 i, i64 j){return a[i].first < a[j].first;}); sort(v2[i].begin(), v2[i].end(), [&](i64 i, i64 j){return b[i].first < b[j].first;}); } using EL = tuple; priority_queue, greater> que; vector idx1(n, 0), idx2(n, 0); for (i64 i = 0; i < n; i++) { i64 id = ord1[i]; while (idx1[i] < m && b[ord2[idx1[i]]].second == a[id].second) idx1[i]++; if (idx1[i] < m) { que.push({a[id].first + b[ord2[idx1[i]]].first, i, ord2[idx1[i]], 0}); idx1[i]++; } if (idx2[i] < v2[a[id].second].size()) { que.push({a[id].first + b[v2[a[id].second][idx2[i]]].first - s[a[id].second], i, v2[a[id].second][idx2[i]], 1}); idx2[i]++; } } while (p > 0) { p--; auto [sum, i, j, op] = que.top(); i64 id = ord1[i]; // cout << p << " " << sum << " " << i << " " << j << "!\n"; que.pop(); if (op == 0) { while (idx1[i] < m && b[ord2[idx1[i]]].second == a[id].second) idx1[i]++; if (idx1[i] < m) { que.push({a[id].first + b[ord2[idx1[i]]].first, i, ord2[idx1[i]], 0}); idx1[i]++; } } else { if (idx2[i] < v2[a[id].second].size()) { que.push({a[id].first + b[v2[a[id].second][idx2[i]]].first - s[a[id].second], i, v2[a[id].second][idx2[i]], 1}); idx2[i]++; } } if (p == 0) { cout << id + 1 << " " << j + 1 << "\n"; } } } }