Submission #969881

#TimeUsernameProblemLanguageResultExecution timeMemory
969881VinhLuuTriple Jump (JOI19_jumps)C++17
100 / 100
776 ms81764 KiB
//#pragma GCC optimize("O3,unroll-loops")
//#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include <bits/stdc++.h>
//#define int long long
#define ll long long
#define fi first
#define se second
#define pb push_back
#define all(lmao) lmao.begin(), lmao.end()

using namespace std;

typedef pair<ll,ll> pii;
typedef tuple<int,int,int> tp;
const int N = 1e6 + 5;
//const int mod = 1e9 + 7;
const ll oo = 5e18;

int n, a[N], T[N << 2], lz[N << 2], q, kq[N], val[N << 2];

void build(int i,int l,int r){
    if(l == r){
        val[i] = T[i] = a[l];
        return;
    }
    int mid = (l + r) / 2;
    build(i << 1, l, mid);
    build(i << 1|1, mid + 1, r);
    val[i] = T[i] = max(T[i << 1], T[i << 1|1]);
}

void update(int i,int l,int r,int u,int v, int x){
    if(l > r || l > v || r < u) return;
    if(u <= l && r <= v){
        val[i] = max(val[i], T[i] + x);
        lz[i] = max(lz[i], x);
        return;
    }
    if(lz[i]){
        val[i << 1] = max(val[i << 1], T[i << 1] + lz[i]);
        val[i << 1|1] = max(val[i << 1|1], T[i << 1|1] + lz[i]);
        lz[i << 1] = max(lz[i << 1], lz[i]);
        lz[i << 1|1] = max(lz[i << 1|1], lz[i]);
        lz[i] = 0;
    }
    int mid = (l + r) / 2;
    update(i << 1, l, mid, u, v, x);
    update(i << 1|1, mid + 1, r, u, v, x);
    val[i] = max(val[i << 1], val[i << 1|1]);
}

int get(int i,int l,int r,int u,int v){
    if(l > r || l > v || r < u) return 0;
    if(u <= l && r <= v) return val[i];
    if(lz[i]){
        val[i << 1] = max(val[i << 1], T[i << 1] + lz[i]);
        val[i << 1|1] = max(val[i << 1|1], T[i << 1|1] + lz[i]);
        lz[i << 1] = max(lz[i << 1], lz[i]);
        lz[i << 1|1] = max(lz[i << 1|1], lz[i]);
        lz[i] = 0;
    }
    int mid = (l + r) / 2;
    return max(get(i << 1, l, mid, u, v), get(i << 1|1, mid + 1, r, u, v));
}


#define lpv
#ifdef lpv

vector<pii> vr[N];

signed main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    #define task "v"
    if(fopen(task ".inp","r")){
        freopen(task ".inp","r",stdin);
        freopen(task ".out","w",stdout);
    }

    cin >> n;
    for(int i = 1; i <= n; i ++) cin >> a[i];
    cin >> q;
    for(int i = 1; i <= q; i ++){
        int l, r; cin >> l >> r;
        vr[l].pb({r, i});
    }
    stack<int> st;
    build(1, 1, n);
    st.push(n);
    for(int i = n - 1; i >= 1; i --){
        if(i + 2 <= n) update(1, 1, n, i + 2, n, a[i] + a[i + 1]);
        while(!st.empty() && a[i] >= a[st.top()]){
            int tmp = st.top() - i;
            if(st.top() + tmp <= n) update(1, 1, n, st.top() + tmp, n, a[i] + a[st.top()]);
            st.pop();
        }
        if(!st.empty()){
            int tmp = st.top() - i;
            if(st.top() + tmp <= n) update(1, 1, n, st.top() + tmp, n, a[i] + a[st.top()]);
        }
        st.push(i);
        for(auto [j, id] : vr[i]) kq[id] = get(1, 1, n, i + 2, j);

    }
    for(int i = 1; i <= q; i ++) cout << kq[i] << "\n";
}

#endif // lpv

Compilation message (stderr)

jumps.cpp: In function 'int main()':
jumps.cpp:77:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   77 |         freopen(task ".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
jumps.cpp:78:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   78 |         freopen(task ".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...