Submission #1222336

#TimeUsernameProblemLanguageResultExecution timeMemory
1222336thangdz2k7Triple Jump (JOI19_jumps)C++20
100 / 100
657 ms48936 KiB
#include <bits/stdc++.h> using namespace std; const int MAX = 5e5 + 5; int n, a[MAX], q, ans[MAX]; vector <pair <int, int>> queries[MAX]; int Max_cur[MAX << 2], Max_add[MAX << 2], Max_val[MAX << 2]; void build(int s, int l, int r){ if (l == r){ Max_cur[s] = a[l]; Max_val[s] = a[l]; return; } int mid = l + r >> 1; build(s << 1, l, mid); build(s << 1 | 1, mid + 1, r); Max_cur[s] = max(Max_cur[s << 1], Max_cur[s << 1 | 1]); Max_val[s] = Max_cur[s]; } void update(int u, int v, int val, int s = 1, int l = 1, int r = n){ if (u <= l && r <= v){ Max_add[s] = max(Max_add[s], val); Max_val[s] = max(Max_val[s], Max_cur[s] + val); return; } int mid = l + r >> 1; if (mid >= u) update(u, v, val, s << 1, l, mid); if (mid < v) update(u, v, val, s << 1 | 1, mid + 1, r); Max_val[s] = max({Max_val[s << 1], Max_val[s << 1 | 1], Max_cur[s] + Max_add[s]}); } pair <int, int> get(int u, int v, int s = 1, int l = 1, int r = n){ if (v < l || u > r) return make_pair(0, 0); if (u <= l && r <= v) return make_pair(Max_val[s], Max_cur[s]); int mid = l + r >> 1; auto [a, b] = get(u, v, s << 1, l, mid); auto [c, d] = get(u, v, s << 1 | 1, mid + 1, r); return make_pair(max({a, c, max(b, d) + Max_add[s]}), max(b, d)); } void process(){ cin >> n; for (int i = 1; i <= n; ++ i) cin >> a[i]; build(1, 1, n); cin >> q; for (int i = 1; i <= q; ++ i){ int l, r; cin >> l >> r; queries[l].emplace_back(r, i); } auto add = [&](int i, int j) -> void { int k = j + (j - i); if (k > n) return; update(k, n, a[i] + a[j]); }; vector <int> stk = {n}; for (int l = n - 1; l >= 1; -- l){ while (stk.size() && a[l] >= a[stk.back()]){ add(l, stk.back()); stk.pop_back(); } if (stk.size()) add(l, stk.back()); stk.push_back(l); for (auto [r, id] : queries[l]) ans[id] = get(l, r).first; } for (int i = 1; i <= q; ++ i) cout << ans[i] << "\n"; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); process(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...