int n, m, k, t; int a[kMaxN], s[kMaxN], c[kMaxN], x[kMaxN], lst[kMaxN], now[kMaxN]; i64 veg[kMaxT], ans[kMaxT]; std::vector<std::tuple<int, int, int>> vec[kMaxN];
intgettime(int c, int x){ if (!x) return1e5; elsereturn (c - 1) / x + 1; }
voidsolve(){ std::priority_queue<std::tuple<int, int, int>> q; for (int c = 1e5; c; --c) { for (auto [x, w, cnt] : vec[c]) q.emplace(w, x, cnt), now[x] += cnt; std::vector<int> vv; for (int cc = 1; cc <= m && !q.empty(); ++cc) { auto [w, i, cnt] = q.top(); q.pop(); veg[++t] = w, --now[i], --cnt; if (cnt) q.emplace(w, i, cnt); if (!now[i] && x[i]) { if (lst[i] > c) q.emplace(a[i], i, now[i] += x[i] * (lst[i] - c)), lst[i] = c; else vv.emplace_back(i); } } for (auto i : vv) q.emplace(a[i], i, now[i] += x[i]), lst[i] = c - 1; } std::sort(veg + 1, veg + 1 + t, std::greater<>()); for (int i = 1; i <= t; ++i) ans[i] = ans[i - 1] + veg[i]; }
voiddickdreamer(){ std::cin >> n >> m >> k; for (int i = 1; i <= n; ++i) { std::cin >> a[i] >> s[i] >> c[i] >> x[i]; vec[gettime(c[i], x[i])].emplace_back(0, a[i] + s[i], 1); --c[i]; if (c[i]) { int t = gettime(c[i], x[i]); lst[i] = t; vec[t].emplace_back(i, a[i], c[i] - x[i] * (t - 1)); } } solve(); for (int i = 1; i <= k; ++i) { int p; std::cin >> p; std::cout << ans[std::min(p * m, t)] << '\n'; } }