Assemble
最小值最大------》二分
int t;
int n,b;
int cnt;
const int MAX=100010;
map<string,int>mp;
struct node{
int pr,pz;
};
int id(string s){
if(!mp.count(s))
mp[s]=cnt++;
return mp[s];
}
vector<node>v[MAX];
int ok(int q){
int sum=0;
for(int i=0;i<cnt;i++){
int mi=INF;
for(int j=0;j<v[i].size();j++){
if(v[i][j].pz>=q){
mi=min(mi,v[i][j].pr);
}
}
if(mi==INF) return 0;
sum+=mi;
}
if(sum>b) return 0;
return 1;
}
int main(){
cin>>t;
while (t--) {
cin>>n>>b;
mp.clear();
for(int i=0;i<n;i++){
v[i].clear();
}
int maxd=-INF;
for(int i=0;i<n;i++){
string a,b;
int c,d;
cin>>a>>b>>c>>d;
maxd=max(maxd,d);
v[id(a)].push_back({c,d});
}
int l=0;
int r=maxd;
while (l<r) {
int m=(l+r)>>1;
if(ok(m)){
l=m;
}
else {
r=m-1;
}
}
cout<<l<<endl;
}
}