// Naive O(NM) solution. Should exceed the time limit. #include #include #include #include #include #include #include using namespace std; using Point = array; struct Dish { Point p = {}; int index = -1; }; struct Person { Point p = {}; int index = -1; }; template vector read_input(int N) { vector read(N); for (int i = 0; i < N; i++) { read[i].index = i; for (int k = 0; k < 2; ++k) { cin >> read[i].p[k]; assert(read[i].p[k] >= 0); // Prevent overflows. assert(read[i].p[k] <= 1e8); } } return read; } vector solve(vector dishes, vector persons) { vector preferred; for (int i = 0; i < persons.size(); ++i) { int64_t best = -1; int best_i = -1; for (const Dish &d : dishes) { int64_t affinity = d.p[0] * persons[i].p[0] + d.p[1] * persons[i].p[1]; if (affinity > best || affinity == best && best_i > d.index) { best = affinity; best_i = d.index; } } preferred.push_back(best_i); } return preferred; } int main() { int N, M; cin >> N >> M; auto dishes = read_input(N); auto persons = read_input(M); vector preferred = solve(dishes, persons); for (int pref : preferred) { cout << pref + 1 << "\n"; } }