#include using namespace std; const int MAXN = (int) 1e5 + 10; vector getPrefSum(vector a) { vector ans(a.size()); for (int i = 0; i < a.size(); i++) { if (i == 0) { ans[0] = a[0]; } else { ans[i] = ans[i - 1] + a[i]; } } return ans; } int solveByBinarySearch(vector a, long long p, long long q) { vector even, odd; for (int i = 0; i < a.size(); i++) { if (a[i] % 2 == 0) { even.push_back(a[i]); } else { odd.push_back(a[i]); } } sort(even.begin(), even.end()); sort(odd.begin(), odd.end()); vector prefEven = getPrefSum(even); vector prefOdd = getPrefSum(odd); int ans = 0; for (int o = 0; o <= min(p, (long long) odd.size()); o++) { long long rem = p + 2 * q; if (o > 0) { rem -= prefOdd[o - 1]; } if (rem < 0) { continue; } int lo = 0, hi = (int) even.size() - 1; int idx = -1; while (lo <= hi) { int mid = (lo + hi) / 2; if (prefEven[mid] > rem) { hi = mid - 1; } else { idx = mid; lo = mid + 1; } } int total = o + idx + 1; ans = max(ans, total); } return ans; } int solveUsingGreedy(vector a, long long ones, long long twos) { sort(a.begin(), a.end()); int ans = 0; for (int change : a) { long long removedFromTwos = 0; if (2 * twos >= change) { twos -= change / 2; removedFromTwos = change / 2; change %= 2; } else { change -= 2 * twos; twos = 0; } if (ones >= change) { ones -= change; ans++; } else { twos += removedFromTwos; } } return ans; } int main() { int T; scanf("%d", &T); assert(T >= 1 && T <= (int) 1e6); int sumN = 0; while (T--) { int n; long long p, q; scanf("%d %lld %lld", &n, &p, &q); sumN += n; assert(n >= 1 && n <= (int) 1e5); assert(p >= 0 && p <= (long long) 1e14); assert(q >= 0 && q <= (long long) 1e14); vector a; for (int i = 0; i < n; i++) { int x; scanf("%d", &x); assert(x >= 1 && x <= (int) 1e9); a.push_back(x); } int ans = solveUsingGreedy(a, p, q); // int ans = solveByBinarySearch(a, p, q); printf("%d\n", ans); } assert(sumN <= (int) 1e6); return 0; }