Submission #1298058

#TimeUsernameProblemLanguageResultExecution timeMemory
1298058BahaminTwo Antennas (JOI19_antennas)C++20
100 / 100
379 ms52084 KiB
#include <bits/stdc++.h> using namespace std; template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p) { return os << '(' << p.first << ", " << p.second << ')'; } template<typename T_container, typename T = typename enable_if<!is_same<T_container, string>::value, typename T_container::value_type>::type> ostream& operator<<(ostream &os, const T_container &v) { os << '{'; string sep; for (const T &x : v) os << sep << x, sep = ", "; return os << '}'; } #define ll long long #define ld long double #define all(a) (a).begin(), (a).end() #define sui cout.tie(NULL); cin.tie(NULL); ios_base::sync_with_stdio(false) #define lid id << 1 #define rid id << 1 | 1 #define mid ((r + l) >> 1) const ll MAX_N = 2e5 + 5; const ll MOD = 1e9 + 7; const ll INF = 1e12; const ld EPS = 1e-9; const ll LOG = 30; pair<ll, pair<ll, ll>> seg[MAX_N << 2]; pair<ll, ll> ops[MAX_N << 2]; ll h[MAX_N]; void build(ll l, ll r, ll id) { seg[id] = {-INF, {-INF, INF}}; ops[id] = {-INF, INF}; if (l == r - 1) return; build(l, mid, lid); build(mid, r, rid); } void move(ll l, ll r, ll id) { if (l == r - 1) return; seg[lid].first = max({seg[lid].first, ops[id].first - seg[lid].second.second, seg[lid].second.first - ops[id].second}); seg[rid].first = max({seg[rid].first, ops[id].first - seg[rid].second.second, seg[rid].second.first - ops[id].second}); ops[lid].first = max(ops[lid].first, ops[id].first); ops[lid].second = min(ops[lid].second, ops[id].second); ops[rid].first = max(ops[rid].first, ops[id].first); ops[rid].second = min(ops[rid].second, ops[id].second); ops[id] = {-INF, INF}; } pair<ll, pair<ll, ll>> merge(pair<ll, pair<ll, ll>> x, pair<ll, pair<ll, ll>> y) { pair<ll, pair<ll, ll>> re; re.first = max(x.first, y.first); re.second.first = max(x.second.first, y.second.first); re.second.second = min(x.second.second, y.second.second); return re; } void upd(ll s, ll t, ll x, ll l, ll r, ll id) { move(l, r, id); if (s <= l && t >= r) { ops[id].first = max(ops[id].first, x); ops[id].second = min(ops[id].second, x); seg[id].first = max({seg[id].first, x - seg[id].second.second, seg[id].second.first - x}); return; } if (s < mid) upd(s, t, x, l, mid, lid); if (t > mid) upd(s, t, x, mid, r, rid); seg[id] = merge(seg[lid], seg[rid]); } void rem(ll x, ll l, ll r, ll id) { move(l, r, id); if (l == r - 1) { seg[id].second = {-INF, INF}; return; } if (x < mid) rem(x, l, mid, lid); else rem(x, mid, r, rid); seg[id] = merge(seg[lid], seg[rid]); } void add(ll x, ll l, ll r, ll id) { move(l, r, id); if (l == r - 1) { seg[id].second = {h[l], h[l]}; return; } if (x < mid) add(x, l, mid, lid); else add(x, mid, r, rid); seg[id] = merge(seg[lid], seg[rid]); } ll get(ll s, ll t, ll l, ll r, ll id) { move(l, r, id); if (s <= l && t >= r) return seg[id].first; if (s >= r || t <= l) return -INF; return max(get(s, t, l, mid, lid), get(s, t, mid, r, rid)); } void solve() { ll n; cin >> n; ll a[n]; ll b[n]; for (ll i = 0; i < n; i++) cin >> h[i] >> a[i] >> b[i]; ll q; cin >> q; ll ans[q]; vector<pair<ll, ll>> qs[n]; for (ll i = 0; i < q; i++) { ll l, r; cin >> l >> r; l--, r--; qs[l].push_back({r, i}); } vector<ll> add1[n]; vector<ll> rem1[n]; for (ll i = 0; i < n; i++) { if (i - a[i] >= 0) add1[i - a[i]].push_back(i); if (i - b[i] - 1 >= 0) rem1[i - b[i] - 1].push_back(i); } build(0, n, 1); for (ll i = n - 1; i >= 0; i--) { for (ll x : add1[i]) add(x, 0, n, 1); for (ll x : rem1[i]) rem(x, 0, n, 1); if (i + a[i] < n) upd(i + a[i], min(n, i + b[i] + 1), h[i], 0, n, 1); for (auto x : qs[i]) ans[x.second] = get(i, x.first + 1, 0, n, 1); } for (ll i = 0; i < q; i++) cout << max(ans[i], (ll) -1) << "\n"; } int main() { sui; ll tc = 1; //cin >> tc; for (ll t = 1; t <= tc; t++) { solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...