#include "festival.h"
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define ll long long
vector<int> SolveSubtask5(int A,vector<int> P,vector<int> T){
    int n=P.size();
    vector<int> ans(n);
    iota(ans.begin(),ans.end(),0);
    sort(ans.begin(),ans.end(),[&](int i,int j){
        if(T[i]==1 && T[j]==1)return P[i]<P[j];
        if(T[i]==1)return false;
        if(T[j]==1)return true;
        return (ll)-P[i]*T[i]*T[j]-(ll)P[j]*T[j]>(ll)-P[j]*T[j]*T[i]-(ll)P[i]*T[i];
    });
    return ans;
}
vector<int> SolveSubtask6(ll A,vector<int> P,vector<int> T,vector<int> rem,vector<int> t1){
    int n=P.size();
    array<vector<int>,5> cand;
    vector<int> idx(n);
    for(int i=0;i<rem.size();i++)idx[rem[i]]=i;
    for(int i:rem){
        cand[T[i]].pb(i);
    }
    cand[1]=t1;
    array<int,5> mxPtr;
    for(int i=1;i<=4;i++){
        sort(cand[i].begin(),cand[i].end(),[&](int i,int j){return P[i]<P[j];});
        ll X=A;
        for(mxPtr[i]=0;mxPtr[i]<cand[i].size();mxPtr[i]++){
            int j=cand[i][mxPtr[i]];
            if(X<P[j])break;
            X=(X-P[j])*T[j];
        }
    }
    vector<int> ans;
    for(int a=0;a<=mxPtr[2];a++){
        for(int b=0;b<=mxPtr[3];b++){
            for(int c=0;c<=mxPtr[4];c++){
                vector<int> now;
                for(int i=0;i<a;i++)now.pb(cand[2][i]);
                for(int i=0;i<b;i++)now.pb(cand[3][i]);
                for(int i=0;i<c;i++)now.pb(cand[4][i]);
                sort(now.begin(),now.end(),[&](int i,int j){return idx[i]<idx[j];});
                ll X=A;
                bool ok=true;
                for(int i:now){
                    if(X<P[i]){
                        ok=false;
                        break;
                    }
                    X=(X-P[i])*T[i];
                }
                if(ok){
                    for(int i:cand[1]){
                        if(X<P[i]){
                            break;
                        }
                        X-=P[i];
                        now.pb(i);
                    }
                    if(ans.size()<now.size()){
                        ans=now;
                    }
                }
            }
        }
    }
    return ans;
}
const ll lim=1e15;
vector<int> Solve(ll A,vector<int> P,vector<int> T){
    int n=P.size();
    vector<int> ord,rem,t1;
    for(int i=0;i<n;i++){
        if(T[i]>1)ord.pb(i);
        else t1.pb(i);
    }
    sort(ord.begin(),ord.end(),[&](int i,int j){
        return (ll)-P[i]*T[i]*T[j]-(ll)P[j]*T[j]>(ll)-P[j]*T[j]*T[i]-(ll)P[i]*T[i];
    });
    vector<int> ans;
    for(int i:ord){
        ll B=(A-P[i])*T[i];
        if(B>=A){
            ans.pb(i);
            A=B;
            A=min(A,lim);
        }else{
            rem.pb(i);
        }
    }
    vector<int> sol=SolveSubtask6(A,P,T,rem,t1);
    for(int i:sol)ans.pb(i);
    return ans;
}
vector<int> max_coupons(int A, vector<int> P, vector<int> T) {
    //return SolveSubtask5(A,P,T);
    //return SolveSubtask6(A,P,T);
    return Solve(A,P,T);
}
| # | 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... |