Submission #928421

#TimeUsernameProblemLanguageResultExecution timeMemory
928421vjudge1Triple Jump (JOI19_jumps)C++17
100 / 100
973 ms124028 KiB
#include <bits/stdc++.h> #define ll long long using namespace std; const int N = 5e5 + 2; ll a[N + 2]; int b[N + 2]; int c[N + 2]; vector < pair < int , int > > query[N + 2]; ll st[4 * N + 2]; ll mx1[4 * N + 2]; ll mx2[4 * N + 2]; vector < int > d[N + 2]; vector < int > f[N + 2]; void update(int id , int l , int r , int post , ll val ){ if(l > post || r < post){ return; } if(l == r){ mx1[id] = max(mx1[id],a[l]); mx2[id] = max(mx2[id],val); st[id] = mx1[id] + mx2[id]; return ; } int mid = (l + r) / 2; update(id * 2 , l , mid , post , val); update(id * 2 + 1 , mid + 1 , r , post , val); st[id] = max({st[id * 2 + 1] , st[id * 2] , mx2[id * 2] + mx1[id * 2 + 1]}); mx1[id] = max(mx1[id * 2] , mx1[id * 2 + 1]); mx2[id ] = max(mx2[id * 2 + 1] , mx2[id * 2]); } pair < ll , pair <ll , ll > > get(int id , int l , int r ,int u , int v ){ if(l > v || r < u)return {0 , {0 , 0 }}; pair < ll , pair <ll , ll > > ans; if(u <= l && r <= v){ return {st[id] , {mx1[id], mx2[id]}}; } int mid =(l + r) /2; auto[max1 , cur1] = get(id * 2 , l , mid ,u ,v); auto[max2 , cur2] = get(id * 2 + 1 , mid + 1 , r ,u ,v); ans.first = max({max1 , max2 , cur1.second + cur2.first}); ans.second.first = max(cur2.first, cur1.first); ans.second.second = max(cur2.second ,cur1.second); return ans; } ll res[N + 2]; void solve() { int n ,q ; cin >> n ; stack< int > q1; stack< int > q2; for(int i = 1 ;i <= n ;i ++){ cin >> a[i]; } q1.push(n + 1); q2.push(n + 2); a[n + 1] = INT64_MAX; a[n + 2] = INT64_MIN; for(int i = n ; i >= 1 ; i --){ while(a[q1.top()] < a[i])q1.pop(); while(a[q2.top()] >= a[i])q2.pop(); b[i] = q1.top(); c[i] = q2.top(); q1.push(i); q2.push(i); } while(q1.size())q1.pop(); while(q2.size())q2.pop(); for(int i = 1; i <= n ;i ++){ while(q1.size() && a[q1.top()] < a[i])q1.pop(); while(q2.size()&& a[q2.top()] >= a[i])q2.pop(); if(q1.size())d[q1.top()].push_back(i); if(q2.size())f[q2.top()].push_back(i); q1.push(i); q2.push(i); } cin >> q; for(int i = 1; i <= q; i ++){ int l , r; cin >> l >> r; query[l].push_back({r , i}); } for(int i = n ;i >= 1 ;i --){ update(1 , 1 , n , 2 * b[i] - i , a[i] + a[b[i]]); update(1 , 1 , n , 2 * c[i] - i , a[i] + a[c[i]]); for(auto vl : d[i]){ update(1 , 1 , n , 2 * vl - i , a[i] + a[vl]); } for(auto vl : f[i]){ update(1 , 1 , n , 2 * vl - i , a[i] + a[vl]); } for(auto[r , id] : query[i]){ res[id] = get(1 , 1 , n , i , r).first; } } for(int i = 1; i <= q; i ++)cout << res[i] << "\n"; } signed main() { ios::sync_with_stdio(0), cin.tie(0); #define _ "digit." if (fopen(_ "inp", "r")) { freopen(_ "inp", "r", stdin); freopen(_ "out", "w", stdout); } solve(); }

Compilation message (stderr)

jumps.cpp: In function 'int main()':
jumps.cpp:106:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  106 |         freopen(_ "inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
jumps.cpp:107:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  107 |         freopen(_ "out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...