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
| #include <bits/stdc++.h>
const int kMaxN = 5e4 + 5, kMaxT = 2e7 + 5;
struct Node { int ls, rs, cnt; } t[kMaxT];
int n, m, sgt_cnt; int rt1[kMaxN * 4], rt2[kMaxN * 4];
void update(int &x, int l, int r, int ql, int v) { if (!x) x = ++sgt_cnt; t[x].cnt += v; if (l == r) return; int mid = (l + r) >> 1; if (ql <= mid) update(t[x].ls, l, mid, ql, v); else update(t[x].rs, mid + 1, r, ql, v); }
void update_arr(int x, int l, int r, int ql, int qr, int c) { if (l > qr || r < ql) return; if (l >= ql && r <= qr) { update(rt1[x], -n, n, c, 1); return; } update(rt2[x], -n, n, c, std::min(r, qr) - std::max(l, ql) + 1); int mid = (l + r) >> 1; update_arr(x << 1, l, mid, ql, qr, c), update_arr(x << 1 | 1, mid + 1, r, ql, qr, c); }
void getpos(int x, int l, int r, int ql, int qr, std::vector<std::pair<int, int>> &vec) { if (l > qr || r < ql) return; if (rt1[x]) vec.emplace_back(rt1[x], std::min(r, qr) - std::max(l, ql) + 1); if (l >= ql && r <= qr) { if (rt2[x]) vec.emplace_back(rt2[x], 1); return; } int mid = (l + r) >> 1; getpos(x << 1, l, mid, ql, qr, vec), getpos(x << 1 | 1, mid + 1, r, ql, qr, vec); }
int query(int l, int r, int64_t c) { std::vector<std::pair<int, int>> vec; getpos(1, 1, n, l, r, vec); int L = -n, R = n; for (; L != R;) { int mid = (L + R) >> 1; int64_t crs = 0; for (auto [x, w] : vec) crs += 1ll * w * t[t[x].rs].cnt; if (c <= crs) { L = mid + 1; for (auto &[x, w] : vec) x = t[x].rs; } else { c -= crs, R = mid; for (auto &[x, w] : vec) x = t[x].ls; } } return L; }
void dickdreamer() { std::cin >> n >> m; for (int i = 1; i <= m; ++i) { int op, l, r; int64_t c; std::cin >> op >> l >> r >> c; if (op == 1) update_arr(1, 1, n, l, r, c); else std::cout << query(l, r, c) << '\n'; } }
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; }
|