#include <bits/stdc++.h>
using namespace std;
struct DataPoint {
vector<double> coordinates;
int index;
double distance;
};
struct Compare {
bool operator()(const pair<double, int>& a, const pair<double, int>& b) {
if (a.first == b.first) {
return a.second > b.second;
}
return a.first < b.first;
}
};
double manhattanDistance(const vector<double>& a, const vector<double>& b) {
double dist = 0;
for (size_t i = 0; i < a.size(); ++i) {
dist += abs(a[i] - b[i]);
}
return dist;
}
void updateDistance(DataPoint& point, const vector<double>& reference) {
point.distance = manhattanDistance(point.coordinates, reference);
}
int main() {
int n, m, k, q;
cin >> n >> m >> k >> q;
vector<DataPoint> points(n);
for (int i = 0; i < n; ++i) {
points[i].index = i + 1;
points[i].coordinates.resize(m);
for (int j = 0; j < m; ++j) {
cin >> points[i].coordinates[j];
}
}
vector<double> reference(m);
for (int i = 0; i < m; ++i) {
cin >> reference[i];
}
vector<vector<double>> queries(q, vector<double>(m + 1));
for (int i = 0; i < q; ++i) {
cin >> queries[i][0];
for (int j = 1; j <= m; ++j) {
cin >> queries[i][j];
}
}
for (auto& point : points) {
updateDistance(point, reference);
}
for (const auto& query : queries) {
int idx = static_cast<int>(query[0]) - 1;
for (int j = 0; j < m; ++j) {
points[idx].coordinates[j] = query[j + 1];
}
updateDistance(points[idx], reference);
priority_queue<pair<double, int>, vector<pair<double, int>>, Compare> pq;
for (const auto& point : points) {
pq.push({point.distance, point.index});
if (pq.size() > k) pq.pop();
}
vector<int> knn;
while (!pq.empty()) {
knn.push_back(pq.top().second);
pq.pop();
}
sort(knn.begin(), knn.end());
for (size_t i = 0; i < knn.size(); ++i) {
if (i > 0) cout << " ";
cout << knn[i];
}
cout << "\n";
}
return 0;
}