Submission #367745

#TimeUsernameProblemLanguageResultExecution timeMemory
367745BartolMTriple Jump (JOI19_jumps)C++17
100 / 100
1425 ms87788 KiB
#include <bits/stdc++.h>

using namespace std;

#define X first
#define Y second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <int, pii> pip;
typedef pair <pii, int> ppi;
typedef pair <ll, ll> pll;

const int INF=0x3f3f3f3f;
const int N=5e5+5;
const int OFF=(1<<19);

struct Node{
    int ab, c, res;
    Node (int ab_=-INF, int c_=-INF, int res_=-INF) {
        ab=ab_; c=c_; res=res_;
    }
};

int n, q;
int p[N], sol[N];
vector <pii> que[N];
vector <int> v[N];
vector <int> st;
Node T[2*OFF];
#define DEBUG 0

Node mrg(Node a, Node b) {
    Node ret=Node(max(a.ab, b.ab), max(a.c, b.c), max(a.res, b.res));
    ret.res=max(ret.res, a.ab+b.c);
    return ret;
}

void update(int pos, int val, int fl) {
    if (pos>=n) return;

    pos+=OFF;
    if (fl) T[pos].ab=max(T[pos].ab, val);
    else T[pos].c=max(T[pos].c, val);
    T[pos].res=max(T[pos].res, T[pos].ab+T[pos].c);

    pos/=2;
    while (pos) {
        T[pos]=mrg(T[pos*2], T[pos*2+1]);
        pos/=2;
    }
}

Node query(int a, int b, int pos=1, int lo=0, int hi=OFF) {
    if (lo>=a && hi<=b) return T[pos];
    if (lo>=b || hi<=a) return Node();
    int mid=(lo+hi)/2;
    return mrg(query(a, b, pos*2, lo, mid), query(a, b, pos*2+1, mid, hi));
}

void solve() {
    for (int i=0; i<n; ++i) {
        while (st.size() && p[st.back()]<=p[i]) {
            v[st.back()].pb(i);
            st.pop_back();
        }
        if (st.size()) v[st.back()].pb(i);
        st.pb(i);
    }
    #if DEBUG
        for (int i=0; i<n; ++i) {
            for (int r:v[i]) printf("[%d, %d]\n", i, r);
        }
    #endif // DEBUG
    for (int i=n-1; i>=0; --i) {
        update(i, p[i], 0);
        for (int r:v[i]) update(2*r-i, p[i]+p[r], 1);
        for (pii pp:que[i]) sol[pp.Y]=query(i, pp.X+1).res;
    }
    for (int i=0; i<q; ++i) printf("%d\n", sol[i]);
}

void load() {
    scanf("%d", &n);
    for (int i=0; i<n; ++i) scanf("%d", &p[i]);
    scanf("%d", &q);
    for (int i=0; i<q; ++i) {
        int l, r;
        scanf("%d %d", &l, &r); l--; r--;
        que[l].pb(mp(r, i));
    }
}

int main() {
    load();
    solve();
    return 0;
}

Compilation message (stderr)

jumps.cpp: In function 'void load()':
jumps.cpp:85:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   85 |     scanf("%d", &n);
      |     ~~~~~^~~~~~~~~~
jumps.cpp:86:34: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   86 |     for (int i=0; i<n; ++i) scanf("%d", &p[i]);
      |                             ~~~~~^~~~~~~~~~~~~
jumps.cpp:87:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   87 |     scanf("%d", &q);
      |     ~~~~~^~~~~~~~~~
jumps.cpp:90:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   90 |         scanf("%d %d", &l, &r); l--; r--;
      |         ~~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...