이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 1e9 + 9;
struct segment_tree {
int size;
vector<int> D, C, H;
segment_tree() {}
segment_tree(int sz) {
size = sz;
D.resize(4 * size, -inf);
C.resize(4 * size, -inf);
H.resize(4 * size, -inf);
}
void push(int t, int l, int r) {
D[t] = max(D[t], C[t] + H[t]);
if (l + 1 != r) {
H[t * 2 + 1] = max(H[t * 2 + 1], H[t]);
H[t * 2 + 2] = max(H[t * 2 + 2], H[t]);
}
H[t] = -inf;
}
void set_C(int t, int l, int r, int id, int vl) {
push(t, l, r);
if (l + 1 == r) {
C[t] = vl;
D[t] = max(D[t], C[t] + H[t]);
return;
}
int md = r + l >> 1;
if (md > id)
set_C(t * 2 + 1, l, md, id, vl);
else
set_C(t * 2 + 2, md, r, id, vl);
D[t] = max({D[t], D[t * 2 + 1], D[t * 2 + 2]});
C[t] = max(C[t * 2 + 1], C[t * 2 + 2]);
}
int get(int t, int l, int r, int x, int y) {
push(t, l, r);
if (l >= y || r <= x)
return -inf;
if (l >= x && r <= y)
return D[t];
int md = r + l >> 1;
return max(get(t * 2 + 1, l, md, x, y), get(t * 2 + 2, md, r, x, y));
}
void set_H(int t, int l, int r, int x, int y, int vl) {
push(t, l, r);
if (l >= y || r <= x)
return;
if (l >= x && r <= y) {
H[t] = vl;
push(t, l, r);
return;
}
int md = r + l >> 1;
set_H(t * 2 + 1, l, md, x, y, vl);
set_H(t * 2 + 2, md, r, x, y, vl);
D[t] = max({D[t], D[t * 2 + 1], D[t * 2 + 2]});
}
void set_C(int id, int vl) { set_C(0, 0, size, id, vl); }
int get(int x, int y) { return get(0, 0, size, x, y + 1); }
void set_H(int x, int y, int vl) { set_H(0, 0, size, x, y + 1, vl); }
};
const int N = 2e5 + 5;
int n, a[N], b[N], h[N];
int q, l[N], r[N], ans[N];
vector<int> qq[N], add[N], del[N];
void solve() {
segment_tree sgt(n);
for (int i = 0; i < n; ++i) {
for (int id : add[i])
sgt.set_C(id, -h[id]);
int L = max(0, i - b[i]);
int R = i - a[i];
if (L <= R)
sgt.set_H(L, R, h[i]);
for (int id : qq[i])
ans[id] = max(ans[id], sgt.get(l[id], r[id]));
for (int id : del[i])
sgt.set_C(id, -inf);
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> h[i] >> a[i] >> b[i];
if (i + a[i] < n)
add[i + a[i]].push_back(i);
if (i + b[i] < n)
del[i + b[i]].push_back(i);
}
cin >> q;
for (int i = 0; i < q; ++i) {
cin >> l[i] >> r[i];
l[i]--, r[i]--;
qq[r[i]].push_back(i);
ans[i] = -1;
}
solve();
for (int i = 0; i < n; ++i)
h[i] = -h[i];
solve();
for (int i = 0; i < q; ++i) {
if (ans[i] < 0)
cout << "-1\n";
else
cout << ans[i] << '\n';
}
}
컴파일 시 표준 에러 (stderr) 메시지
antennas.cpp: In member function 'void segment_tree::set_C(int, int, int, int, int)':
antennas.cpp:33:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
33 | int md = r + l >> 1;
| ~~^~~
antennas.cpp: In member function 'int segment_tree::get(int, int, int, int, int)':
antennas.cpp:47:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
47 | int md = r + l >> 1;
| ~~^~~
antennas.cpp: In member function 'void segment_tree::set_H(int, int, int, int, int, int)':
antennas.cpp:59:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
59 | int md = r + l >> 1;
| ~~^~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |