Submission #1230697

#TimeUsernameProblemLanguageResultExecution timeMemory
1230697zNatsumiTriple Jump (JOI19_jumps)C++20
100 / 100
800 ms66772 KiB
#include <bits/stdc++.h> using namespace std; #define int long long using ii = pair<int, int>; const int N = 5e5 + 5; int n, q, a[N], st[N<<2], mx[N<<2], lz[N<<2], res[N]; vector<ii> query[N]; void build(int tl = 1, int tr = n, int i = 1){ if(tl == tr){ mx[i] = a[tl]; return; } int tm = tl + tr >> 1; build(tl, tm, i<<1); build(tm + 1, tr, i<<1|1); mx[i] = max(mx[i<<1], mx[i<<1|1]); } void push(int i){ if(!lz[i]) return; st[i<<1] = max(st[i<<1], lz[i] + mx[i<<1]); st[i<<1|1] = max(st[i<<1|1], lz[i] + mx[i<<1|1]); lz[i<<1] = max(lz[i<<1], lz[i]); lz[i<<1|1] = max(lz[i<<1|1], lz[i]); lz[i] = 0; } void update(int l, int r, int x, int tl = 1, int tr = n, int i = 1){ if(r < tl || tr < l || l > r) return; if(l <= tl && tr <= r){ st[i] = max(st[i], x + mx[i]); lz[i] = max(lz[i], x); return; } push(i); int tm = tl + tr >> 1; update(l, r, x, tl, tm, i<<1); update(l, r, x, tm + 1, tr, i<<1|1); st[i] = max(st[i<<1], st[i<<1|1]); } int get(int l, int r, int tl = 1, int tr = n, int i = 1){ if(r < tl || tr < l || l > r) return 0; if(l <= tl && tr <= r) return st[i]; push(i); int tm = tl + tr >> 1; return max(get(l, r, tl, tm, i<<1), get(l, r, tm + 1, tr, i<<1|1)); } int32_t main(){ cin.tie(0)->sync_with_stdio(0); // #define task "test" // if(fopen(task ".inp", "r")){ // freopen(task ".inp", "r", stdin); // freopen(task ".out", "w", stdout); // } cin >> n; for(int i = 1; i <= n; i++) cin >> a[i]; cin >> q; for(int i = 1; i <= q; i++){ int l, r; cin >> l >> r; query[l].push_back({r, i}); } build(); stack<int> s; for(int i = n; i >= 1; i--){ while(s.size()){ update(2*s.top() - i, n, a[i] + a[s.top()]); if(a[s.top()] <= a[i]) s.pop(); else break; } s.push(i); for(auto [r, idx] : query[i]) res[idx] = get(i, r); } for(int i = 1; i <= q; i++) cout << res[i] << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...