#include "festival.h"
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll INF = 1e18;
vector<int> cur, best;
int best1;
void solve(int pos, ll tok, int type, vector<int> &a, vector<pair<ll, int> > &b, vector<int> &p, vector<int> &t) {
    if(type==1 || pos==a.size()) 
    {
        auto it=lower_bound(b.begin(), b.end(), make_pair(tok+1, -1))-b.begin();
        if (it+cur.size()>best.size()+best1) 
        {
            best=cur;
            best1=it;
        }
        return ;
    }
    if(tok>=p[a[pos]] && type>=t[a[pos]]) {
        cur.push_back(a[pos]);
        solve(pos+1, min((tok-p[a[pos]])*t[a[pos]], INF), type, a, b, p, t);
        cur.pop_back();
    }
    solve(pos + 1, tok, min(type, t[a[pos]] - 1), a, b, p, t);
}
vector<int> max_coupons(int A, vector<int> p, vector<int> t) {
    vector<int> a;
    vector<pair<ll, int>> b;
    int n=p.size();
    for(int i=0; i<n; i++)
        t[i]!=1 ? a.push_back(i) : b.push_back({p[i], i});
    sort(a.begin(), a.end(), [&](int i, int j) 
    {
        if(t[i]==t[j]) 
            return p[i]<p[j];
        else
            return p[i]*t[i]*(t[j]-1) < p[j]*t[j]*(t[i]-1);
    });
    sort(b.begin(), b.end());
    for(int i=1; i<b.size(); i++)
        b[i].first+=b[i-1].first;
    vector<int> res;
    ll tok = A;
    for(auto i: a) 
    {
        if ((tok-p[i])*t[i]>=tok) 
        {
            tok=(tok-p[i])*t[i];
            tok=min(tok, (long long)1e15);
            res.push_back(i);
        } else
            break;
    }
    a.erase(a.begin(), a.begin()+(int)res.size());
    solve(0, tok, 4, a, b, p, t);
    for(auto i: best)
        res.push_back(i);
    for(int i = 0; i < best1; i++) {
        res.push_back(b[i].second);
    }
    return res;
}
| # | 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... |