Submission #1180210

#TimeUsernameProblemLanguageResultExecution timeMemory
1180210AlishFish 3 (JOI24_fish3)C++20
100 / 100
1103 ms44964 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long int	ll;
typedef pair<int, int>	pii;
typedef pair<ll, ll>	pll;
typedef long double     ld;


#define F		        first
#define S		        second
#define pb		        push_back
#define endl            '\n'
#define Mp              make_pair
#define all(x)          x.begin(), x.end()
#define debug(x)        cerr << #x << " = " << x << endl;
#define fast_io         ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define file_io         freopen("input19.txt" , "r" , stdin) ;

const int N = 3e5+23;

ll c[N], ans[N], seg[4*N], lpz[4*N];
vector<pii> in[N];
ll d;
int n, q;
vector<pair<pll, pll> > st; // Mnc, Mxc, l, r

void Shift(int l, int r, int ind){
    if(r-l==1) return;
    if(!lpz[ind]) return;
    int mid=(r+l)>>1;
    seg[2*ind+1]+=(mid-l)*lpz[ind];
    lpz[2*ind+1]+=lpz[ind];

    seg[2*ind+2]+=(r-mid)*lpz[ind];
    lpz[2*ind+2]+=lpz[ind];

    lpz[ind]=0;
}

void upd(int lx, int rx, ll x, int l=1, int r=n+1, int ind=0){
    Shift(l, r, ind);
    if(lx>=r || rx<=l) return;
    if(lx<=l && rx>=r){
        seg[ind]+=x*(r-l);
        lpz[ind]+=x;
        return;
    }
    int mid=(r+l)>>1;
    upd(lx, rx, x, l, mid, 2*ind+1); upd(lx, rx, x, mid, r, 2*ind+2);
    seg[ind]=seg[2*ind+1]+seg[2*ind+2];
}

ll get(int lx, int rx, int l=1, int r=n+1, int ind=0){
    Shift(l, r, ind);
    if(lx>=r || rx<=l) return 0;
    if(lx<=l && rx>=r) return seg[ind];
    int mid=(r+l)>>1;
    return get(lx, rx, l, mid, 2*ind+1)+get(lx, rx, mid, r, 2*ind+2);
}

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

    cin>>q;
    for(int i=0; i<q; i++){
        int l, r; cin>>l>>r;
        in[r].pb({l, i});
    }

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

        while(!st.empty() && st.back().F.S>c[i]){
            ll Mnc=st.back().F.F, Mxc=st.back().F.S, l=st.back().S.F, r=st.back().S.S;
            st.pop_back();
            ll x=(Mxc-c[i]+d-1)/d;
            if(!st.empty()) x=min(x, (Mnc-st.back().F.S)/d);
            upd(l, r+1, x);
            Mnc-=x*d; Mxc-=x*d;
            if(!st.empty() && Mnc-st.back().F.S<d) {
                Mnc=st.back().F.F;
                l=st.back().S.F;
                st.pop_back();
            }
            st.pb({{Mnc, Mxc}, {l, r}});
        }
        st.pb({{c[i], c[i]}, {i, i}});
        for (auto pp: in[i]){
            if(c[pp.F]-get(pp.F, pp.F+1)*d<0) ans[pp.S]=-1;
            else ans[pp.S]=get(pp.F, i+1);
        }
    }
    for (int i=0; i<q; i++) cout<<ans[i]<<endl;

}
#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...