Submission #1161633

#TimeUsernameProblemLanguageResultExecution timeMemory
1161633hahahoang132Triple Jump (JOI19_jumps)C++20
100 / 100
1061 ms111592 KiB
#include<bits/stdc++.h> using namespace std; using ll = int; using ld = long double; const ll N = 5e5 + 5; const ll mod = 1e9 + 7; #define bit(x,y) ((x >> y) & 1) ll a[N]; struct segtree { ll n; ll b[N * 4]; ll c[N * 4]; ll d[N * 4]; ll lz[N * 4]; void build(ll n) { this->n = n; build(0,1,n); } void build(ll x, ll l, ll r) { if(l == r) { b[x] = a[l]; }else { ll mid = (l + r) / 2; build(x * 2 + 1,l,mid); build(x * 2 + 2,mid + 1,r); b[x] = max(b[x * 2 + 1],b[x * 2 + 2]); } } void udt(ll l, ll r, ll v) { udt(0,1,n,l,r,v); } void push(ll x) { if(lz[x] == 0) return; ll x1 = x * 2 + 1; ll x2 = x1 + 1; ll v = lz[x]; lz[x] = 0; c[x1] = max(c[x1],v); d[x1] = max(d[x1],b[x1] + c[x1]); c[x2] = max(c[x2],v); d[x2] = max(d[x2],b[x2] + c[x2]); lz[x1] = max(lz[x1],v); lz[x2] = max(lz[x2],v); } void udt(ll x, ll l, ll r, ll s, ll e, ll v) { if(e < l || r < s) return; if(s <= l && r <= e) { c[x] = max(c[x],v); d[x] = max(d[x],c[x] + b[x]); lz[x] = max(lz[x],v); return; } ll mid = (l + r) / 2; push(x); udt(x * 2 + 1,l,mid,s,e,v); udt(x * 2 + 2,mid + 1,r,s,e,v); d[x] = max(d[x * 2 + 1],d[x * 2 + 2]); } ll get(ll l, ll r) { return get(0,1,n,l,r); } ll get(ll x, ll l, ll r, ll s, ll e) { if(e < l || r < s) return 0; if(s <= l && r <= e) return d[x]; ll mid = (l + r) / 2; push(x); return max(get(x * 2 + 1,l,mid,s,e),get(x * 2 + 2,mid + 1,r,s,e)); } }; segtree f; vector<ll> b[N]; vector<pair<ll,ll>> qr[N]; vector<pair<ll,ll>> haha[N]; ll ans[N]; int main() { ios_base::sync_with_stdio(false); cin.tie(0); ll n,q; ll i,j; cin >> n; for(i = 1;i <= n;i++) cin >> a[i]; stack<ll> st; for(i = 1;i <= n;i++) { while(!st.empty() && a[st.top()] <= a[i]) { b[i].push_back(st.top()); st.pop(); } if(!st.empty()) b[i].push_back(st.top()); st.push(i); } f.build(n); cin >> q; for(i = 1;i <= q;i++) { ll l,r; cin >> l >> r; qr[l].push_back({r,i}); } for(i = 1;i <= n;i++) { for(auto t : b[i]) { ll t2 = 2 * i - t; if(t2 <= n) haha[t].push_back({t2,a[i] + a[t]}); } } for(i = n;i >= 1;i--) { for(auto tmp : haha[i]) { f.udt(tmp.first,n,tmp.second); } for(auto tmp : qr[i]) { ans[tmp.second] = f.get(i,tmp.first); } } for(i = 1;i <= q;i++) cout << ans[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...