#include<bits/stdc++.h>
    using namespace std;
    vector<int> max_coupons(int a, vector<int> p, vector<int> t) {
        #define pb push_back
        int n = p.size();
        vector<vector<int>> f;
        for (int i = 0; i < n; i++) {
            f.pb({p[i], t[i], i});
        }
        sort(f.begin(), f.end(), [&](vector<int> a, vector<int> b) {
            if (a[1] == b[1])
                return a[0] < b[0];
            else {
                int A = -a[0]*a[1]*b[1] - b[0]*b[1];
                int B = -b[0]*a[1]*b[1] - a[0]*a[1];
                if (A == B)
                    return a[0] < b[0];
                return A > B;
            }
        });
        vector<int> ans;
        vector<vector<int>> dp(n+1, vector<int> (n+1, -1));
        // int dp[n+1][n+1]; // dp[i][j] -> choose j from first i
        // memset(dp, -1, sizeof dp);
        for (int i = 1; i <= n; i++) {
            dp[i][1] = (a-f[i-1][0]) * f[i-1][1];
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                dp[i][j] = max(dp[i-1][j], dp[i][j]);
                dp[i][j] = max((dp[i-1][j-1] - f[i-1][0]) * f[i-1][1], dp[i][j]);
            }
        }
        int am = n;
        while (am > 0 and dp[n][am] < 0) {
            am--;
        }
        if (am == 0)
            return {};
        int last = n;
        while (am > 0 and last > 0) {
            if (am == last or dp[last][am] != dp[last-1][am]) {
                ans.pb(f[last-1][2]);
                last--;
                am--;
                continue;
            }
            last--;
        }
        reverse(ans.begin(), ans.end());
        return ans;
    }
    /*
    int main() {
        ios::sync_with_stdio(0);
        cin.tie(0);
        cout.tie(0);
        int n, a; cin>> n >> a;
        vector<int> p(n), t(n);
        for (int &e : p)
            cin>> e;
        for (int &e : t)
            cin>> e;
        vector<int> ans = max_coupons(a, p, t);
        for (int e : ans)
            cout<< e << ' ';
        cout<< '\n';
        return 0;
    }
    */
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |