이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
const int INF = 2e9;
struct Seg{
vector<int> Smi, Sma;
int cap;
void init(int n){
for(cap = 1; cap < n; cap *= 2);
Smi.resize(2*cap, INF);
Sma.resize(2*cap);
}
void upd(int i, int v){
i += cap;
if(v > 0) Smi[i] = Sma[i] = v;
else Smi[i] = INF, Sma[i] = 0;
while(i > 1){
i /= 2;
Smi[i] = min(Smi[2*i], Smi[2*i+1]);
Sma[i] = max(Sma[2*i], Sma[2*i+1]);
}
}
pair<int, int> qry(int l, int r, int a, int b, int i){
if(l <= a && b <= r) return {Smi[i], Sma[i]};
if(r < a || b < l) return {INF, 0};
int m = (a+b)/2;
auto [mi1, ma1] = qry(l, r, a, m, 2*i);
auto [mi2, ma2] = qry(l, r, m+1, b, 2*i+1);
return {min(mi1, mi2), max(ma1, ma2)};
}
pair<int, int> qry(int l, int r){return qry(l, r, 1, cap, 1);}
};
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
int n, q;
cin >> n;
vector<int> h(n), a(n), b(n);
for(int i = 0; i < n; i++) cin >> h[i] >> a[i] >> b[i];
cin >> q;
int qL, qR;
cin >> qL >> qR;
Seg seg;
seg.init(n);
vector<vector<pair<int, int>>> todo(n);
int ans = -1;
for(int i = 0; i < n; i++){
for(auto [j, v] : todo[i]){
seg.upd(j, v);
}
if(i+a[i]<n) todo[i+a[i]].emplace_back(i, h[i]);
if(i+b[i]+1<n) todo[i+b[i]+1].emplace_back(i, 0);
int l = max(0, i-b[i]);
int r = max(-1, i-a[i]);
if(r == -1) continue;
auto [mi, ma] = seg.qry(l+1, r+1);
ans = max(ans, max(h[i]-mi, ma-h[i]));
}
cout << ans << "\n";
}
# | 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... |