#include "festival.h"
#include <bits/stdc++.h>
using namespace std;
#define int long long
struct thing {
    int p, t, id;
    bool operator < (const thing &b) const {
        if (t == b.t) return p < b.p;
        return (b.t - 1) * t * p < (t - 1) * b.t * b.p;
    }
};
const int maxn = 2e5 + 5, INF = 1e16;
int n;
vector<thing> a = {{0, 1, -1}}, A;
int first1;
int l[maxn], r[maxn];
int val[maxn], add1 = 0;
vector<int> pos[5];
void calc(int i) {
    if (val[l[i]] == INF) val[i] = INF;
    else val[i] = (val[l[i]] - A[i].p) * A[i].t;
    val[i] = min(val[i], INF);
}
int money(int i) {
    return val[i] + (i >= first1) * add1;
}
void update(int ll, int rr) {
    for (int i = ll; i <= rr; i = r[i]) {
        if (i >= first1) {
            int ori = val[i];
            calc(i);
            add1 = val[i] - ori;
            val[i] = ori;
            break;
        }
        calc(i);
    }
}
vector<int32_t> max_coupons(int32_t AA, vector<int32_t> P, vector<int32_t> T) {
    n = P.size();
    for (int i=0;i<n;i++) a.push_back({P[i], T[i], i});
    sort(a.begin() + 1, a.end());
    first1 = n+1;
    for (int i=1;i<=n;i++) if (a[i].t == 1) {
        first1 = i;
        break;
    }
    A = a;
    for (int i=1;i<=n;i++) l[i] = i-1, r[i] = i+1;
    val[0] = AA;
    pair<int, pair<int,int>> mxsz = {0, {0, 0}};
    int cursz = 0;
    vector<int> del;
    for (int i=1;i<=n;i++) {
        calc(i);
        pos[A[i].t].push_back(i);
        cursz++;
        while (money(i) < 0) {
            pair<int,int> mx = {-1, -1};
            for (int j=2;j<=4;j++) if (pos[j].size()) {
                int cur = pos[j].back();
                thing temp = A[cur];
                A[cur] = {0, 1, -1};
                update(cur, i);
                mx = max(make_pair(money(i), j), mx);
                A[cur] = temp;
                update(cur, i);
            }
            if (mx.first < 0) break;
            int J = mx.second;
            int cur = pos[J].back();
            pos[J].pop_back();
            A[cur] = {0, 1, -1};
            update(cur, i);
            del.push_back(cur);
            cursz--;
            r[l[cur]] = r[cur], l[r[cur]] = l[cur];
        }
        if (money(i) < 0) break;
        mxsz = max(make_pair(cursz, make_pair(i, (int)del.size())), mxsz);
    }
    vector<int32_t> ans;
    
    for (int i=0;i<mxsz.second.second;i++) a[del[i]].id = -1;
    for (int i=1;i<=mxsz.second.first;i++) if (a[i].id != -1) ans.push_back(a[i].id);
    return ans;
}
| # | 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... |