#include "bits/stdc++.h"
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pii pair<int,int>
#define yes cout<<"YES\n"
#define no cout<<"NO\n"
#define pb push_back
#define sz(x) (int)(x).size()
#define rsz resize
#define ass assign
#define F(i,l,r) for(int i=(l);i<(r);++i)
typedef long long ll;
typedef unsigned long long ull;
typedef long double lld;
//template<typename T> using pqg = priority_queue<T, vector<T>, greater<T>>;
#define each(a,x) for(auto a:x)
#define FOR(i,a) for(int i=0;i<(a);i++)
#define ROF(i,a,b) for(int i=(b)-1;i>=(a);i--)
#define eb emplace_back
#define ft front()
#define V vector
#ifndef ONLINE_JUDGE
#define debug(x) cerr << #x <<" "; _print(x); cerr << endl;
#else
#define debug(x)
#endif
void _print(ll t) {cerr << t;}
void _print(int t) {cerr << t;}
void _print(string t) {cerr << t;}
void _print(char t) {cerr << t;}
void _print(lld t) {cerr << t;}
void _print(double t) {cerr << t;}
void _print(ull t) {cerr << t;}
template <class T, class V> void _print(pair <T, V> p);
template <class T> void _print(vector <T> v);
template <class T> void _print(set <T> v);
template <class T, class V> void _print(map <T, V> v);
template <class T> void _print(multiset <T> v);
template <class T, class V> void _print(pair <T, V> p) {cerr << "{"; _print(p.ff); cerr << ","; _print(p.ss); cerr << "}";}
template <class T> void _print(vector <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T> void _print(set <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T> void _print(multiset <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T, class V> void _print(map <T, V> v) {cerr << "[ "; for (auto i : v) {_print(i); cerr << " ";} cerr << "]";}
#include "festival.h"
V<int> max_coupons(int A,V<int> P,V<int> T){
int n=sz(P);
V<pair<ll,int> > t1,t2;
FOR(i,n){
if(T[i]==1)t1.pb({(ll)P[i],i});
else if(T[i]==2)t2.pb({(ll)P[i],i});
}
sort(t1.begin(),t1.end());
sort(t2.begin(),t2.end());
V<ll> ps1(sz(t1)+1,0);
FOR(i,sz(t1))ps1[i+1]=ps1[i]+t1[i].fi;
int bestk=0,bestm=0,mx=0;
ll cur=A;
const ll inf=2e18;
for(int k=0;k<=sz(t2);++k){
int m=0;
if(cur){
auto it=upper_bound(ps1.begin(),ps1.end(),cur);
m=distance(ps1.begin(),it)-1;
}
if(k+m>mx){
mx=k+m;
bestk=k;
bestm=m;
}
if(k<sz(t2)){
if(cur<t2[k].fi)break;
cur-=t2[k].fi;
if(cur>inf/2)cur=inf;
else cur<<=1;
}
}
V<int> res;
FOR(i,bestk)res.pb(t2[i].se);
FOR(i,bestm)res.pb(t1[i].se);
return res;
}