Submission #1034657

#TimeUsernameProblemLanguageResultExecution timeMemory
1034657juicyTriple Jump (JOI19_jumps)C++17
100 / 100
642 ms52548 KiB
#include <bits/stdc++.h> using namespace std; #ifdef LOCAL #include "debug.h" #else #define debug(...) 42 #endif const int N = 5e5 + 5; int n, q; int a[N], s[4 * N], mx[4 * N], lz[4 * N], res[N]; void bld(int id = 1, int l = 1, int r = n) { if (l == r) { mx[id] = a[l]; return; } int md = (l + r) / 2; bld(id * 2, l, md); bld(id * 2 + 1, md + 1, r); mx[id] = max(mx[id * 2], mx[id * 2 + 1]); } void app(int id, int x) { s[id] = max(s[id], mx[id] + x); lz[id] = max(lz[id], x); } void psh(int id) { if (lz[id]) { app(id * 2, lz[id]); app(id * 2 + 1, lz[id]); lz[id] = 0; } } void upd(int u, int v, int x, int id = 1, int l = 1, int r = n) { if (u <= l && r <= v) { app(id, x); return; } psh(id); int md = (l + r) / 2; if (u <= md) { upd(u, v, x, id * 2, l, md); } if (md < v) { upd(u, v, x, id * 2 + 1, md + 1, r); } s[id] = max(s[id * 2], s[id * 2 + 1]); } int qry(int u, int v, int id = 1, int l = 1, int r = n) { if (u <= l && r <= v) { return s[id]; } psh(id); int md = (l + r) / 2; if (v <= md) { return qry(u, v, id * 2, l, md); } if (md < u) { return qry(u, v, id * 2 + 1, md + 1, r); } return max(qry(u, v, id * 2, l, md), qry(u, v, id * 2 + 1, md + 1, r)); } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n; vector<int> st; vector<array<int, 2>> cands; for (int i = 1; i <= n; ++i) { cin >> a[i]; while (st.size() && a[st.back()] < a[i]) { st.pop_back(); } if (st.size()) { cands.push_back({st.back(), i}); } st.push_back(i); } bld(); st.clear(); for (int i = n; i > 0; --i) { while (st.size() && a[st.back()] < a[i]) { st.pop_back(); } if (st.size()) { cands.push_back({i, st.back()}); } st.push_back(i); } cin >> q; vector<array<int, 3>> Queries; for (int i = 1; i <= q; ++i) { int l, r; cin >> l >> r; Queries.push_back({l, r, i}); } sort(cands.rbegin(), cands.rend()); sort(Queries.rbegin(), Queries.rend()); int j = 0; for (auto [l, r, id] : Queries) { while (j < cands.size() && cands[j][0] >= l) { int c = 2 * cands[j][1] - cands[j][0]; if (c <= n) { upd(c, n, a[cands[j][0]] + a[cands[j][1]]); } ++j; } res[id] = qry(l, r); } for (int i = 1; i <= q; ++i) { cout << res[i] << "\n"; } return 0; }

Compilation message (stderr)

jumps.cpp: In function 'int main()':
jumps.cpp:108:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  108 |     while (j < cands.size() && cands[j][0] >= l) {
      |            ~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...