#55268: cpp_answer


yp11451202@yphs.tp.edu.tw (705-38黃鈺潤)


#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

typedef long long ll;

struct Player {
    int id;
    ll s, t;
    int loss_count;
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    int n, m;
    if (!(cin >> n >> m)) return 0;

    vector<Player> players(n);
    vector<int> order(n);
    for (int i = 0; i < n; ++i) cin >> players[i].s;
    for (int i = 0; i < n; ++i) cin >> players[i].t;
    for (int i = 0; i < n; ++i) {
        cin >> order[i];
        players[order[i] - 1].id = order[i];
        players[order[i] - 1].loss_count = 0;
    }

    // 建立初始比賽順序的指標陣列
    vector<int> current_round;
    for (int i = 0; i < n; ++i) {
        current_round.push_back(order[i] - 1);
    }

    while (current_round.size() > 1) {
        vector<int> winners, losers;
        int num_players = current_round.size();

        for (int i = 0; i < num_players - 1; i += 2) {
            int p1_idx = current_round[i];
            int p2_idx = current_round[i + 1];
            
            ll a = players[p1_idx].s;
            ll b = players[p1_idx].t;
            ll c = players[p2_idx].s;
            ll d = players[p2_idx].t;

            if (a * b >= c * d) {
                // p1 獲勝
                players[p1_idx].s = a + (c * d) / (2 * b);
                players[p1_idx].t = b + (c * d) / (2 * a);
                players[p2_idx].s = c + c / 2;
                players[p2_idx].t = d + d / 2;
                players[p2_idx].loss_count++;
                winners.push_back(p1_idx);
                if (players[p2_idx].loss_count < m) losers.push_back(p2_idx);
            } else {
                // p2 獲勝
                players[p2_idx].s = c + (a * b) / (2 * d);
                players[p2_idx].t = d + (a * b) / (2 * c);
                players[p1_idx].s = a + a / 2;
                players[p1_idx].t = b + b / 2;
                players[p1_idx].loss_count++;
                winners.push_back(p2_idx);
                if (players[p1_idx].loss_count < m) losers.push_back(p1_idx);
            }
        }

        // 若人數為奇數,最後一人直接晉級
        if (num_players % 2 == 1) {
            winners.push_back(current_round.back());
        }

        // 將敗部尚可以參賽的人接到勝部後方
        winners.insert(winners.end(), losers.begin(), losers.end());
        current_round = winners;
    }

    cout << players[current_round[0]].id << endl;

    return 0;
}