Submission #1256513

#TimeUsernameProblemLanguageResultExecution timeMemory
1256513IcelastFish 3 (JOI24_fish3)C++20
100 / 100
696 ms155556 KiB
#include <iostream>
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn = 2*1e5+5, INF = 4e18+9;
// Usage: RMQ<int, _min> rmq(a);

template<class T, T (*op) (T, T)> struct RMQ {
    RMQ() = default;
    RMQ(const vector<T>& v) : t{v}, n{(int) v.size()} {
        for (int k = 1; (1<<k) <= n; ++k) {
            t.emplace_back(n - (1<<k) + 1);
            for (int i = 0; i + (1<<k) <= n; ++i) {
                t[k][i] = op(t[k-1][i], t[k-1][i + (1<<(k-1))]);
            }
        }
    }
    // get range [l, r), doesn't work for empty range
    T get(int l, int r) const {
        assert(0 <= l && l < r && r <= n);
        int k = __lg(r - l);
        return op(t[k][l], t[k][r - (1<<k)]);
    }
private:
    vector<vector<T>> t;
    int n;
};
template<class T> T _min(T a, T b) { return b < a ? b : a; }
template<class T> T _max(T a, T b) { return a < b ? b : a; }
void solve(){
    ll n, D;
    cin >> n >> D;
    vector<ll> c(n+1);
    for(int i = 1; i <= n; i++){
        cin >> c[i];
    }
    vector<ll> b(n+1), a(n+1);
    ll cur = 0;
    b[0] = 0;
    for(int i = 1; i <= n; i++){
        b[i] = c[i]%D;
        if(b[i] < b[i-1]){
            b[i] += ((b[i-1] - b[i] - 1) / D + 1) * D;
        }
    }
    for(int i = 1; i <= n; i++){
        a[i] = (c[i]-b[i])/D;
    }
    vector<ll> pf(n+1, 0);
    for(int i = 1; i <= n; i++){
        pf[i] = pf[i-1] + a[i];
    }
    int B = 20;
    vector<vector<pair<ll, ll>>> up(B+1, vector<pair<ll, ll>>(n+1, {0, 0}));
    vector<int> st;
    st.push_back(0);
    a[0] = -INF;
    vector<int> lt(n+1, 0);
    for(int i = 1; i <= n; i++){
        while(a[st.back()] >= a[i]){
            st.pop_back();
        }
        lt[i] = st.back();
        st.push_back(i);
    }
    for(int i = 1; i <= n; i++){
        up[0][i] = {lt[i], (pf[i] - pf[lt[i]]) - a[i] * (i - lt[i])};
    }
    for(int j = 1; j <= B; j++){
        for(int i = 1; i <= n; i++){
            int v = up[j-1][i].first;
            up[j][i] = {up[j-1][v].first, up[j-1][i].second+up[j-1][v].second};
        }
    }
    RMQ<ll, _min> T(a);
    int q;
    cin >> q;
    for(int it = 1; it <= q; it++){
        int l, r;
        cin >> l >> r;
        if(T.get(l, r+1) + b[l]/D < 0){
            cout << -1 << "\n";
            continue;
        }
        ll ans = 0;
        for(int j = 20; j >= 0; j--){
            if(up[j][r].first+1 >= l){
                ans += up[j][r].second;
                r = up[j][r].first;
            }
        }
        ans += (pf[r] - pf[l-1]) - a[r] * (r - l + 1);
        cout << ans << "\n";
    }
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    solve();
}
#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...