Submission #1337681

#TimeUsernameProblemLanguageResultExecution timeMemory
1337681chikien2009Fish 3 (JOI24_fish3)C++20
100 / 100
318 ms44576 KiB
#include <bits/stdc++.h>

using namespace std;

void setup()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}

struct SEGMENT_TREE
{
    long long tree[1200000], rem[1200000];
    inline void Init()
    {
        fill_n(tree, 1200000, 0);
        fill_n(rem, 1200000, -1);
    }
    inline void UpdateNode(int ind, int l, int r)
    {
        if (rem[ind] != -1)
        {
            tree[ind] = rem[ind] * (r - l + 1);
            if (l < r)
            {
                rem[ind << 1] = rem[ind << 1 | 1] = rem[ind];
            }
            rem[ind] = -1;
        }
    }
    inline void Update(int ind, int l, int r, int x, int y, long long v)
    {
        UpdateNode(ind, l, r);
        if (r < x || y < l)
        {
            return;
        }
        if (x <= l && r <= y)
        {
            rem[ind] = v;
            UpdateNode(ind, l, r);
            return;
        }
        int m = (l + r) >> 1;
        Update(ind << 1, l, m, x, y, v);
        Update(ind << 1 | 1, m + 1, r, x, y, v);
        tree[ind] = tree[ind << 1] + tree[ind << 1 | 1];
    }
    inline long long Get(int ind, int l, int r, int x, int y)
    {
        UpdateNode(ind, l, r);
        if (r < x || y < l)
        {
            return 0;
        }
        if (x <= l && r <= y)
        {
            return tree[ind];
        }
        int m = (l + r) >> 1;
        return Get(ind << 1, l, m, x, y) + Get(ind << 1 | 1, m + 1, r, x, y);
    }
} st;

int n, q, x, y;
long long d;
long long a[300000], b[300000], pre[300000], res[300000];
vector<pair<int, int>> query[300000];
vector<array<long long, 3>> v;
array<long long, 3> cur;

int main()
{
    setup();

    cin >> n >> d;
    for (int i = 0; i < n; ++i)
    {
        cin >> a[i];
    }
    for (int i = n - 2; i >= 0; --i)
    {
        b[i] = max(0LL, a[i] - (a[i + 1] - d * b[i + 1]) + d - 1) / d;
    }
    for (int i = 1; i < n; ++i)
    {
        pre[i] = b[i] + pre[i - 1];
    }
    cin >> q;
    for (int i = 0; i < q; ++i)
    {
        cin >> x >> y;
        query[y - 1].push_back({x - 1, i});
    }
    for (int i = 0; i < n; ++i)
    {
        cur = {i, i, b[i]};
        while (!v.empty() && v.back()[2] >= cur[2])
        {
            cur[0] = v.back()[0];
            v.pop_back();
        }
        v.push_back(cur);
        st.Update(1, 0, n - 1, cur[0], cur[1], cur[2]);
        for (auto &j : query[i])
        {
            res[j.second] = pre[i] - pre[j.first] + b[j.first];
            if ((b[j.first] - st.Get(1, 0, n - 1, j.first, j.first)) * d > a[j.first])
            {
                res[j.second] = -1;
            }
            else
            {
                res[j.second] -= st.Get(1, 0, n - 1, j.first, i);
            }
        }
    }
    for (int i = 0; i < q; ++i)
    {
        cout << res[i] << "\n";
    }
    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...