如题,不开 O2 过不去:
https://www.luogu.com.cn/record/98521771
求卡常qwq
#include <bits/stdc++.h>
using namespace std;
const int N = 5e7 + 5;
long long n, q, opt, l, r, k, d, cnt, a[N], sum[N], tag[N], Ls[N], Rs[N];
int ls(int p) { return Ls[p] ? Ls[p] : Ls[p] = ++ cnt; }
int rs(int p) { return Rs[p] ? Rs[p] : Rs[p] = ++ cnt; }
void push_up(int p) { sum[p] = sum[ls(p)] + sum[rs(p)]; }
int lowbit(int x) { return x & -x; }
void push_down(int p, int l, int r) {
int mid = (l + r) >> 1;
tag[ls(p)] += tag[p], sum[ls(p)] += tag[p] * (mid - l + 1);
tag[rs(p)] += tag[p], sum[rs(p)] += tag[p] * (r - mid);
tag[p] = 0;
}
void modify(int p, int l, int r, int nl, int nr, long long k) {
if (nl <= l && r <= nr) { tag[p] += k, sum[p] += (r - l + 1) * k; return; }
push_down(p, l, r);
int mid = (l + r) >> 1;
if (nl <= mid) modify(ls(p), l, mid, nl, nr, k);
if (nr > mid) modify(rs(p), mid + 1, r, nl, nr, k);
push_up(p);
}
long long query(int p, int l, int r, int nl, int nr) {
if (nl <= l && r <= nr) return sum[p];
push_down(p, l, r);
long long mid = (l + r) >> 1, res = 0;
if (nl <= mid) res += query(ls(p), l, mid, nl, nr);
if (nr > mid) res += query(rs(p), mid + 1, r, nl, nr);
return res;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> q, cnt = n;
for (int i = 1; i <= q; i ++) {
cin >> opt >> l >> r >> k;
if (opt == 1) for (int i = n - k + 1; i <= n; i += lowbit(i)) modify(i, 1, n, l, r, 1);
if (opt == 2) {
long long ans = 0, sum = 0;
for (int i = 16; i >= 0; i --) {
if (ans + (1 << i) > n) continue;
long long qwq = query(ans + (1 << i), 1, n, l, r);
if (sum + qwq < k) ans += 1 << i, sum += qwq;
}
cout << n - ans << '\n';
}
}
return 0;
}