Submission #1243360

#TimeUsernameProblemLanguageResultExecution timeMemory
1243360CrabCNHFish 3 (JOI24_fish3)C++20
100 / 100
517 ms44068 KiB
#include <bits/stdc++.h>

#define int long long
#define pii pair <int, int>

using namespace std;

const int maxN = 3e5 + 5;

int n, D;
int c[maxN];
int res[maxN];
vector <pii> off[maxN];

struct ST {
    vector <int> st, lazy;

    inline void init (int _n) {
        st.resize (_n * 4, 0LL);
        lazy.resize (_n * 4, 0LL);
    }

    inline void push (int id, int l, int r) {
        int &t = lazy[id];
        if (t != 0) {
            int mid = (l + r) >> 1;
            st[id * 2] += (mid - l + 1) * t;
            lazy[id * 2] += t;
            st[id * 2 + 1] += (r - (mid + 1) + 1) * t;
            lazy[id * 2 + 1] += t;
        }
        t = 0;
        return;
    }

    void upd (int id, int l, int r, int u, int v, int val) {
        if (v < l || u > r) {
            return;
        }
        if (u <= l && r <= v) {
            st[id] += (r - l + 1) * val;
            lazy[id] += val;
            return;
        }
        push (id, l, r);
        int mid = (l + r) >> 1;
        upd (id * 2, l, mid, u, v, val);
        upd (id * 2 + 1, mid + 1, r, u, v, val);
        st[id] = (st[id * 2] + st[id * 2 + 1]);
        return;
    }

    int get (int id, int l, int r, int u, int v) {
        if (v < l || u > r) {
            return 0;
        }
        if (u <= l && r <= v) {
            return st[id];
        }
        push (id, l, r);
        int mid = (l + r) >> 1;
        int tL = get (id * 2, l, mid, u, v);
        int tR = get (id * 2 + 1, mid + 1, r, u, v);
        return (tL + tR);
    }
};

ST T;

signed main () {
    ios_base :: sync_with_stdio (0);
    cin.tie (0);
    cin >> n >> D;
    T.init (n);
    for (int i = 1; i <= n; i ++) {
        cin >> c[i];
    }
    int q;
    cin >> q;
    for (int i = 1; i <= q; i ++) {
        int l, r;
        cin >> l >> r;
        off[r].push_back ({l, i});
    }
    stack <int> st;
    for (int i = 1; i <= n; i ++) {
        int cur = i;
        while (!st.empty ()) {
            int x = c[cur - 1] - D * T.get (1, 1, n, cur - 1, cur - 1);
            int y = c[cur] - D * T.get (1, 1, n, cur, cur);
            if (x <= y) {
                break;
            }
            int need = (x - y - 1) / D + 1;
            T.upd (1, 1, n, st.top (), cur - 1, need);
            cur = st.top ();
            st.pop ();
        }
        st.push (cur);
        for (auto [l, id] : off[i]) {
            if ((c[l] - D * T.get (1, 1, n, l, l)) < 0) {
                res[id] = -1;
            }
            else {
                res[id] = T.get (1, 1, n, l, i);
            }
        }
    }
    for (int i = 1; i <= q; i ++) {
        cout << res[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...
#Verdict Execution timeMemoryGrader output
Fetching results...