1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
| #include <bits/stdc++.h>
#define int int64_t
const int kMaxN = 2e5 + 5;
int n, m, k, t; int id[kMaxN], val[kMaxN];
struct Node { int n, L, R, now; std::vector<int> a, res = {0}; std::priority_queue<std::tuple<int, int, int, int>, std::vector<std::tuple<int, int, int, int>>, std::greater<>> st; void init(int _L, int _R) { n = a.size(), a.emplace_back(0); L = _L, R = std::min(_R, n); std::sort(a.begin(), a.end()); if (L > n) return; int x = L - 1, y = L, z = n + 1, sum = 0; for (int i = 1; i <= L; ++i) sum += a[i]; st.emplace(sum, x, y, z); } int getnxt() { if (now + 1 < res.size()) { ++now; return res[now] - res[now - 1]; } if (!st.size()) return 1e18; auto [sum, x, y, z] = st.top(); st.pop(); res.emplace_back(sum), ++now; if (y == x + 1 && z == n + 1 && y < R) st.emplace(sum + a[y + 1], x + 1, y + 1, z); if (y >= 1 && y + 1 < z) st.emplace(sum + a[y + 1] - a[y], x, y + 1, z); if (x >= 1 && x + 1 < y) st.emplace(sum + a[x + 1] - a[x], x - 1, x + 1, y); return res[now] - res[now - 1]; } int getpre() { --now; return res[now] - res[now + 1]; } } a[kMaxN];
void dickdreamer() { std::cin >> n >> m >> k; for (int i = 1; i <= n; ++i) { int x, c; std::cin >> x >> c; a[x].a.emplace_back(c); } int base = 0, sum = 0; for (int i = 1; i <= m; ++i) { int l, r; std::cin >> l >> r; a[i].init(l, r); if (r == 0) continue; if (a[i].n < l) { for (int j = 1; j <= k; ++j) std::cout << "-1\n"; return; } if (a[i].n == l) base += a[i].getnxt(), std::cerr << i << '\n'; else sum += a[i].getnxt(), id[++t] = i, val[i] = a[i].getnxt(); } std::sort(id + 1, id + 1 + t, [&] (int i, int j) { return val[i] < val[j]; }); std::priority_queue<std::tuple<int, int, int>, std::vector<std::tuple<int, int, int>>, std::greater<>> q; for (int i = 1; i <= t; ++i) a[i].now = 1; q.emplace(sum, 1, 1); for (int i = 1; i <= k; ++i) { if (!q.size()) { std::cout << "-1\n"; continue; } auto [sum, x, y] = q.top(); q.pop(); std::cout << sum + base << '\n'; { a[id[x]].now = y; int det = a[id[x]].getnxt(); if (det < 1e18) q.emplace(sum + det, x, y + 1); } if (x < t && y != 1) { a[id[x + 1]].now = 1; int det = a[id[x + 1]].getnxt(); if (det < 1e18) q.emplace(sum + det, x + 1, 2); } if (x < t && y == 2) { a[id[x]].now = y, a[id[x + 1]].now = 1; int det = a[id[x]].getpre() + a[id[x + 1]].getnxt(); if (det < 1e18) q.emplace(sum + det, x + 1, 2); } } }
int32_t main() { #ifdef ORZXKR freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0); int T = 1; while (T--) dickdreamer(); return 0; }
|