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;
}