Submission #1250476

#TimeUsernameProblemLanguageResultExecution timeMemory
1250476NHristovFish 3 (JOI24_fish3)C++20
100 / 100
433 ms41808 KiB
#include <bits/stdc++.h>
#define int long long
#define endl '\n'

using namespace std;

const int N = 3e5 + 5;

int n, t;
int d;

int c[N];
vector < pair < int, int > > queries[N];
int ans[N];

struct Node
{
    int val;
    int lazy;
};

struct Seggy
{
    Node tree[4 * N];

    void push(int node, int l, int r)
    {
        if (tree[node].lazy == 0)
        {
            return;
        }

        int mid = (l + r) / 2;

        tree[2 * node].val += (mid - l + 1) * tree[node].lazy;
        tree[2 * node + 1].val += (r - mid) * tree[node].lazy;

        tree[2 * node].lazy += tree[node].lazy;
        tree[2 * node + 1].lazy += tree[node].lazy;

        tree[node].lazy = 0;
    }

    void update(int node, int l, int r, int ql, int qr, int val)
    {
        if (l > qr || r < ql)
        {
            return;
        }

        if (ql <= l && r <= qr)
        {
            tree[node].val += (r - l + 1) * val;
            tree[node].lazy += val;

            return;
        }

        int mid = (l + r) / 2;

        push(node, l, r);

        update(2 * node, l, mid, ql, qr, val);
        update(2 * node + 1, mid + 1, r, ql, qr, val);

        tree[node].val = tree[2 * node].val + tree[2 * node + 1].val;
    }

    int query(int node, int l, int r, int ql, int qr)
    {
        if (l > qr || r < ql)
        {
            return 0;
        }

        if (ql <= l && r <= qr)
        {
            return tree[node].val;
        }

        int mid = (l + r) / 2;

        push(node, l, r);

        return query(2 * node, l, mid, ql, qr) + query(2 * node + 1, mid + 1, r, ql, qr);
    }
};

Seggy segment;

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

    cin >> n >> d;

    for (int i = 1; i <= n; i++)
    {
        cin >> c[i];
    }

    cin >> t;

    for (int i = 1; i <= t; i++)
    {
        int l, r;

        cin >> l >> r;

        queries[r].push_back({l, i});
    }

    stack < int > st;

    for (int i = 1; i <= n; i++)
    {
        int r = i;

        while (!st.empty())
        {
            int a = c[r - 1] - segment.query(1, 1, n, r - 1, r - 1) * d;
            int b = c[r] - segment.query(1, 1, n, r, r) * d;

            if (a <= b)
            {
                break;
            }

            int more = (a - b - 1) / d + 1;

            segment.update(1, 1, n, st.top(), r - 1, more);
            r = st.top();

            st.pop();
        }

        st.push(r);

        for (auto [l, id] : queries[i])
        {
            if (c[l] - segment.query(1, 1, n, l, l) * d < 0)
            {
                ans[id] = -1;
            }
            else
            {
                ans[id] = segment.query(1, 1, n, l, i);
            }
        }
    }

    for (int i = 1; i <= t; i++)
    {
        cout << ans[i] << endl;
    }

    return 0;
}
#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...