long long repairCars(vector<int>& ranks, int cars) {
//long long min_r = *min_element(ranks.begin(), ranks.end());
long long left = 1;
long long right = ranks[0] * (long long)cars * cars;
long long result = right; // Initialize with an upper bound
auto countRepairCars = [&ranks](long long time) {
long long repaired = 0;
for (int r : ranks) {
repaired += (long long)sqrt((double)time / r);
}
return repaired;
};
while (left <= right) {
long long midpoint = left + (right - left) / 2;
long long repaired = countRepairCars(midpoint);
if (repaired >= cars) {
result = midpoint; // Found a valid time, try to minimize it
right = midpoint - 1;
} else {
left = midpoint + 1;
}
}
return result;
}