Submission #1097031

#TimeUsernameProblemLanguageResultExecution timeMemory
1097031vladiliusFish 3 (JOI24_fish3)C++17
37 / 100
393 ms66388 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
#define pb push_back
#define ff first
#define ss second
const ll inf = numeric_limits<ll> :: max();

struct DS{
    vector<pair<ll, ll>> t;
    vector<ll> p;
    int n;
    DS(int ns){
        n = ns;
        t.resize(4 * n, {0, 0});
        p.assign(4 * n, -1);
    }
    void push(int& v, int& tl, int& tr){
        if (p[v] == -1) return;
        int tm = (tl + tr) / 2, vv = 2 * v;
        t[vv].ff = p[v] * (tm - tl + 1);
        t[vv + 1].ff = p[v] * (tr - tm);
        t[vv].ss = t[vv + 1].ss = p[vv] = p[vv + 1] = p[v];
        p[v] = -1;
    }
    int find(int v, int tl, int tr, ll& x){
        if (tl == tr) return tl;
        int tm = (tl + tr) / 2, vv = 2 * v;
        push(v, tl, tr);
        if (t[vv].ss > x){
            return find(vv, tl, tm, x);
        }
        return find(vv + 1, tm + 1, tr, x);
    }
    void ch(int v, int tl, int tr, int& l, int& r, ll& x){
        if (l > tr || r < tl) return;
        if (l <= tl && tr <= r){
            t[v].ff = x * (tr - tl + 1);
            t[v].ss = p[v] = x;
            return;
        }
        int tm = (tl + tr) / 2, vv = 2 * v;
        push(v, tl, tr);
        ch(vv, tl, tm, l, r, x);
        ch(vv + 1, tm + 1, tr, l, r, x);
        t[v].ff = t[vv].ff + t[vv + 1].ff;
        t[v].ss = max(t[vv].ss, t[vv + 1].ss);
    }
    void upd(int p, ll x){
        int t = min(find(1, 1, n, x), p);
        ch(1, 1, n, t, p, x);
    }
    ll get(int v, int tl, int tr, int& l, int& r){
        if (l > tr || r < tl) return 0;
        if (l <= tl && tr <= r) return t[v].ff;
        int tm = (tl + tr) / 2, vv = 2 * v;
        push(v, tl, tr);
        return get(vv, tl, tm, l, r) + get(vv + 1, tm + 1, tr, l, r);
    }
    ll get(int l, int r){
        return get(1, 1, n, l, r);
    }
};

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    int n; ll d; cin>>n>>d;
    vector<ll> a(n + 1);
    for (int i = 1; i <= n; i++){
        cin>>a[i];
    }
    vector<ll> x(n);
    for (int i = 1; i < n; i++){
        x[i] = floor(1.0 * (a[i + 1] - a[i]) / d);
    }
    vector<ll> y(n + 1);
    for (int i = 2; i <= n; i++){
        y[i] = y[i - 1] + x[i - 1];
    }
    
    vector<ll> p(n + 1);
    for (int i = 1; i <= n; i++){
        p[i] = p[i - 1] + y[i];
    }
    
    int q; cin>>q;
    vector<pii> end[n + 1];
    for (int i = 1; i <= q; i++){
        int l, r; cin>>l>>r;
        end[r].pb({l, i});
    }

    vector<ll> out(q + 1);
    DS T(n);
    for (int r = 1; r <= n; r++){
        T.upd(r, y[r]);
        for (auto [l, ii]: end[r]){
            ll h = T.get(l, l) - y[l];
            if ((a[l] + h * d) < 0){
                out[ii] = -1;
                continue;
            }
            out[ii] = (p[r] - p[l - 1]) - T.get(l, r);
        }
    }
    
    for (int i = 1; i <= q; i++){
        cout<<out[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...