rt,LOJ6279,全 WA
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int n, blocksize;
int val[N], blocknum[N], lazy[N];
vector<int> v[1005];
void reset(int x) {
v[x].clear();
for(int i = (x - 1) * blocksize + 1; i <= min(x * blocksize, n); i++) v[x].push_back(val[i]);
sort(v[x].begin(), v[x].end());
}
void update(int l, int r, int c) {
for(int i = l; i <= min(blocknum[l] * blocksize, r); i++) val[i] += c;
reset(blocknum[l]);
if(blocknum[l] != blocknum[r]) {
for(int i = (blocknum[r] - 1) * blocksize + 1; i <= r; i++) val[i] += c;
reset(blocknum[r]);
}
for(int i = blocknum[l] + 1; i < blocknum[r]; i++) lazy[i] += c;
}
int query(int l, int r, int c) {
int ret = -1;
for(int i = l; i <= min(blocknum[l] * blocksize, r); i++) {
if(val[i] + lazy[blocknum[i]] < c) {
ret = max(ret, val[i] + lazy[blocknum[i]]);
}
}
if(blocknum[l] != blocknum[r]) {
for(int i = (blocknum[r] - 1) * blocksize + 1; i <= r; i++) {
if(val[i] + lazy[blocknum[i]] < c) {
ret = max(ret, val[i] + lazy[blocknum[i]]);
}
}
}
for(int i = blocknum[l] + 1; i < blocknum[r]; i++) {
int x = c - lazy[i];
vector<int> :: iterator k = lower_bound(v[i].begin(), v[i].end(), x);
if(k != v[i].end()) {
int p = k - v[i].begin() - 1;
ret = max(ret, v[i][p] + lazy[i]);
}
}
return ret;
}
int main() {
cin >> n;
blocksize = sqrt(n);
for(int i = 1; i <= n; i++) scanf("%d", val + i);
for(int i = 1; i <= n; i++) {
blocknum[i] = (i - 1) / blocksize + 1;
v[blocknum[i]].push_back(val[i]);
}
for(int i = 1; i <= blocknum[n]; i++) sort(v[i].begin(), v[i].end());
for(int i = 1; i <= n; i++) {
int opt, l, r, c;
scanf("%d%d%d%d", &opt, &l, &r, &c);
if(!opt) {
update(l, r, c);
}
else printf("%d\n", query(l, r, c));
}
return 0;
}