求卡常
查看原帖
求卡常
560516
喵仔牛奶楼主2023/1/2 19:13

如题,不开 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;
}
2023/1/2 19:13
加载中...