Submission #1148924

#TimeUsernameProblemLanguageResultExecution timeMemory
1148924IssaTriple Jump (JOI19_jumps)C++20
100 / 100
1125 ms87148 KiB
#include <bits/stdc++.h> #define isb ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0) #define ent "\n" using namespace std; typedef long long ll; const int maxn = 5e5 + 100; const ll INF = 9223372036854775807; const int inf = INT_MAX; int n, m; ll a[maxn]; ll d[maxn*4]; vector<int> q[maxn]; vector<pair<int, int>> e[maxn]; int t[maxn*4]; int c[maxn*4]; int ans[maxn*4]; int res[maxn]; void build(int v, int tl, int tr){ if(tl == tr){ d[v] = a[tl]; } else{ int mid = (tl + tr) / 2; build(v*2, tl, mid); build(v*2+1, mid+1, tr); d[v] = max(d[v*2], d[v*2+1]); } } int getp(int v, int tl, int tr, int pos, int x){ if(tr <= pos) return 0; if(d[v] < x) return 0; if(tl == tr) return tl; int mid = (tl + tr) / 2; int num = getp(v*2, tl, mid, pos, x); if(num != 0) return num; return getp(v*2+1, mid+1, tr, pos, x); } int getb(int v, int tl, int tr, int pos, int x){ if(d[v] < x) return 0; if(pos <= tl) return 0; if(tl == tr) return tr; int mid = (tl + tr) / 2; int num = getb(v*2+1, mid+1, tr, pos, x); if(num != 0) return num; return getb(v*2, tl, mid, pos, x); } void push(int v){ if(t[v] == -1) return; c[v*2] = t[v]; c[v*2+1] = t[v]; ans[v*2] = c[v*2] + d[v*2]; ans[v*2+1] = c[v*2+1] + d[v*2+1]; t[v*2] = t[v]; t[v*2+1] = t[v]; t[v] = -1; } int getf(int v, int tl, int tr, int l, int x){ if(tl != tr) push(v); if(tr < l) return 0; if(c[v] < x) return 0; if(tl == tr) return tl; int mid = (tl + tr) / 2; int num = getf(v*2, tl, mid, l, x); if(num != 0) return num; return getf(v*2+1, mid+1, tr, l, x); } void upd(int v, int tl, int tr, int l, int r, int x){ if(tl != tr) push(v); if(tl > r || tr < l) return; if(l <= tl && tr <= r){ c[v] = t[v] = x; ans[v] = d[v] + x; } else{ int mid = (tl + tr) / 2; upd(v*2, tl, mid, l, r, x); upd(v*2+1, mid+1, tr, l, r, x); ans[v] = max(ans[v*2], ans[v*2+1]); c[v] = max(c[v*2], c[v*2+1]); } } int get(int v, int tl, int tr, int l, int r){ if(tl != tr) push(v); if(tl > r || tr < l) return 0; if(l <= tl && tr <= r) return ans[v]; int mid = (tl + tr) / 2; return max(get(v*2, tl, mid, l, r), get(v*2+1, mid+1, tr, l, r)); } void asd(){ cin >> n; for(int i = 1; i <= n; i++) cin >> a[i]; build(1, 1, n); for(int i = 1; i <= n; i++){ int j = getp(1, 1, n, i, a[i]); int k = getb(1, 1, n, i, a[i]); if(i + 2 <= n && j*2-i <= n && j != 0){ q[i].push_back(j); } if(i > 1 && 2*i-k <= n && k != 0){ q[k].push_back(i); } } cin >> m; for(int i = 1; i <= m; i++){ int l, r; cin >> l >> r; e[l].push_back({r, i}); } for(int i = n; i; i--){ for(int x: q[i]){ int tl = x*2-i; int tr = getf(1, 1, n, tl, a[i] + a[x]); if(c[1] < a[i] + a[x]) tr = n+1; if(tr != 0) upd(1, 1, n, tl, tr-1, a[i] + a[x]); } for(auto x: e[i]){ res[x.second] = get(1, 1, n, i, x.first); } } for(int i = 1; i <= m; i++){ cout << res[i] << ent; } } int main(){ isb; int t = 1; // cin >> t; for(int i = 1; i <= t; i++) asd(), cout << ent; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...