救救孩子吧TAT
查看原帖
救救孩子吧TAT
739534
OI_StarGod楼主2025/8/29 13:46

rt,一堆RE,最后一个点是WA

RE调不出来不愧是我

#include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 5, inf = 1e18, M = 1e3 + 5;

int n, q, opt, l, r, k, m;

int block, pos[N], st[M], ed[M];

long long a[N], b[N], maxn[M], minn[M], lazy[M];

void init() {
	for (int i = 1; i <= m; ++i) {
		st[i] = (i - 1) * block + 1;
		ed[i] = i * block;
		minn[i] = inf;
		maxn[i] = -inf;
	}
	if (ed[m] < n) {
		++m;
		minn[m] = inf;
		maxn[m] = -inf;
		st[m] = ed[m - 1] + 1;
		ed[m] = n; 
	}
	for (int i = 1; i <= m; ++i) {
		for (int j = st[i]; j <= ed[i]; ++j) {
			pos[j] = i;
			maxn[i] = max(maxn[i], a[j]);
			minn[i] = min(minn[i], a[j]);
		}
		sort(b + st[i], b + ed[i] + 1);
	}
}

void little_add(int l, int r, int idx, int val) {
	for (int i = l; i <= r; ++i) {
		a[i] += val;
	}
	for (int i = st[idx]; i <= ed[idx]; ++i) {
		maxn[idx] = max(maxn[idx], a[i] + lazy[idx]);
		minn[idx] = min(minn[idx], a[i] + lazy[idx]);
		b[i] = a[i];
	}
	sort(b + st[idx], b + ed[idx] + 1); 
}

void add(int l, int r, int k) {
	int s = pos[l], e = pos[r];
	if (s == e) {
		little_add(l, r, s, k);
	}else {
		little_add(l, ed[s], s, k);
		little_add(st[e], r, e, k);
		for (int i = s + 1; i < e; ++i) {
			lazy[i] += k;
			maxn[i] += k;
			minn[i] += k;
		}
	}
}

long long little_min(int l, int r, int idx) {
	long long res = inf;
	for (int i = l; i <= r; ++i) {
		res = min(res, a[i] + lazy[idx]);
	}
	return res;
}

long long little_max(int l, int r, int idx) {
	long long res = -inf;
	for (int i = l; i <= r; ++i) {
		res = max(res, a[i] + lazy[idx]);
	}
	return res;
}

long long get_min(int l, int r) {
	int s = pos[l], e = pos[r];
	if (s == e) {
		return little_min(l, r, s);
	}
	long long res = min(little_min(l, ed[s], s), little_min(st[e], r, e));
	for (int i = s + 1; i < e; ++i) {
		res = min(res, minn[i]);
	}
	return res;
}

long long get_max(int l, int r) {
	int s = pos[l], e = pos[r];
	if (s == e) {
		return little_max(l, r, s);
	}
	long long res = max(little_max(l, ed[s], s), little_max(st[e], r, e));
	for (int i = s + 1; i < e; ++i) {
		res = max(res, maxn[i]);
	}
	return res;
}

int calc(int l, int r, long long x, int idx) {
	if (x < minn[idx]) {
		return 0;
	}
	if (x >= maxn[idx]) {
		return r - l + 1;
	}
	int cnt = 0;
	for (int i = l; i <= r; ++i) {
		if (a[i] + lazy[i] <= x) {
			++cnt;
		}
	}
	return cnt;
}

bool check(int l, int r, long long x) {
	int s = pos[l], e = pos[r];
	if (s == e) {
		return calc(l, r, x, s) >= k;
	}
	int cnt = calc(l, ed[s], x, s) + calc(st[e], r, x, e);
	for (int i = s + 1; i < e; ++i) {
		if (x >= minn[i]) {
			cnt += upper_bound(b + st[i], b + ed[i] + 1, x - lazy[i]) - b - st[i];
		}else if (x >= maxn[i]) {
			cnt += block;
		}
	}
	return cnt >= k;
}

long long ask(int ql, int qr, int k) {
	long long l = get_min(ql, qr), r = get_max(ql, qr), ans = -1;
	while (l <= r) {
		int mid = (l + r) >> 1;
		if (check(l, r, mid)) {
			ans = mid;
			r = mid - 1;
		}else {
			l = mid + 1;
		}
	}
	return ans;
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> n >> q;
	block = sqrt(n);
	m = n / block;
	for (int i = 1; i <= n; ++i) {
		cin >> a[i];
		b[i] = a[i];
	}
	init();
	while (q--) {
		cin >> opt >> l >> r >> k;
		if (opt == 1) {
			cout << ask(l, r, k) << '\n';
		}else {
			add(l, r, k);
		}
	}
	return 0;
}
2025/8/29 13:46
加载中...