Submission #1283337

#TimeUsernameProblemLanguageResultExecution timeMemory
1283337diep38Triple Jump (JOI19_jumps)C++20
100 / 100
934 ms95092 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define ed "\n" #define fi first #define se second #define irs insert #define pb push_back #define pi pair<int,int> #define MASK(i) (1LL << (i)) #define BIT(x, i) ((x>>i)&1) #define ON(x, i) ((x) MASK(i)) #define OFF(x, i) ((x) & ~MASK(i)) #define ALL(v) v.begin() , v.end() #define pii pair<int,pair<int,int>> #define fl(i,a,b) for(int i=a;i>=b;--i) #define fis(i,a,b) for(int i=a;i<=b;++i) const int mod=1e9+7; const int Mdem=998244353; const int LOG=19; const int base=31; const int maxn=5e5+5; const int bl = 320; #define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define gay(a) freopen(a".inp","r",stdin),freopen(a".out","w",stdout) template <class T> bool minimize(T &a, const T &b) { if(a > b) {a = b; return 1;} return 0; } template <class T> bool maximize(T &a, const T &b) { if(a < b) {a = b; return 1;} return 0; } template <class T> void compress(vector <T> &v) { sort(ALL(v)); v.erase(unique(ALL(v)), (v).end()); } void add(int &a, int b) { a += b; if (a >= mod) a -= mod; } void sub(int &a, int b) { a -= b; if (a < 0) a += mod; } int n, q; int a[maxn]; ll mx[4 * maxn], t[4 * maxn], lz[4 * maxn]; vector<int> g[maxn]; stack<int> stk; vector<int> Q[maxn]; pi p[maxn]; ll ans[maxn]; void Push(int i){ while(stk.size() && a[i] > a[stk.top()]){ g[i].pb(stk.top()); stk.pop(); } if(stk.size()) g[i].pb(stk.top()); stk.push(i); } void combine(int id){ t[id] = max(t[id * 2], t[id * 2 + 1]); mx[id] = max(mx[id * 2], mx[id * 2 + 1]); } void build(int id, int l, int r){ if(l > r) return; if(l == r){ t[id] = mx[id] = a[l]; return; } int mid = (l + r) >> 1; build(id * 2, l, mid); build(id * 2 + 1, mid + 1, r); combine(id); } void down(int id){ if(lz[id]){ t[id * 2] = max(t[id * 2], mx[id * 2] + lz[id]); t[id * 2 + 1] = max(t[id * 2 + 1], mx[id * 2 + 1] + lz[id]); lz[id * 2] = max(lz[id * 2], lz[id]); lz[id * 2 + 1] = max(lz[id * 2 + 1], lz[id]); lz[id] = 0; } } void update(int id, int l, int r, int u, int v, ll val){ if(l > v || r < u) return; if(l >= u && r <= v){ t[id] = max(t[id], mx[id] + val); lz[id] = max(lz[id], val); return; } down(id); int mid = (l + r) >> 1; update(id * 2, l, mid, u, v, val); update(id * 2 + 1, mid + 1, r, u, v, val); combine(id); } ll get(int id, int l, int r, int u, int v){ if(l > v || r < u) return 0; if(l >= u && r <= v){ return t[id]; } down(id); int mid = (l + r) >> 1; return max(get(id * 2, l, mid, u, v), get(id * 2 + 1, mid + 1, r, u, v)); } signed main(){ fast; cin >> n; fis(i, 1, n) cin >> a[i]; build(1, 1, n); fl(i, n, 1) Push(i); cin >> q; fis(i, 1, q){ int l, r; cin >> l >> r; p[i] = {l, r}; Q[l].pb(i); } fl(x, n, 1){ for(int y : g[x]) update(1, 1, n, 2 * y - x, n, a[x] + a[y]); for(int id : Q[x]) ans[id] = get(1, 1, n, p[id].fi, p[id].se); } fis(i, 1, q) cout << ans[i] << ed; 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...