제출 #1054877

#제출 시각아이디문제언어결과실행 시간메모리
1054877ttamxFish 3 (JOI24_fish3)C++17
100 / 100
569 ms63920 KiB
#include<bits/stdc++.h>

using namespace std;

using ll = long long;

const int N=3e5+5;
const int K=1<<20;
const ll INF=1e18;

int n,q;
ll d;
ll c[N];
vector<pair<int,int>> qr[N];
ll ans[N];
stack<pair<int,int>> st;

struct Segtree{
    struct node{
        ll ans,mn,mx;
        node():ans(0),mn(INF),mx(-INF){}
        node(ll v):ans(0),mn(v),mx(v){}
        node(ll _ans,ll _mn,ll _mx):ans(_ans),mn(_mn),mx(_mx){}
        friend node operator+(const node &lhs,const node &rhs){
            return node(lhs.ans+rhs.ans,min(lhs.mn,rhs.mn),max(lhs.mx,rhs.mx));
        }
    }t[K];
    ll lz[K];
    void pushlz(int l,int r,int i){
        t[i].ans+=(r-l+1)*lz[i];
        t[i].mn-=lz[i]*d;
        t[i].mx-=lz[i]*d;
        if(l<r){
            lz[i*2]+=lz[i];
            lz[i*2+1]+=lz[i];
        }
        lz[i]=0;
    }
    void build(int l,int r,int i){
        if(l==r)return void(t[i]=node(c[l]));
        int m=(l+r)/2;
        build(l,m,i*2);
        build(m+1,r,i*2+1);
        t[i]=t[i*2]+t[i*2+1];
    }
    void build(){
        build(1,n,1);
    }
    void update(int l,int r,int i,int x,int y,ll v){
        pushlz(l,r,i);
        if(y<l||r<x)return;
        if(x<=l&&r<=y)return lz[i]=v,pushlz(l,r,i);
        int m=(l+r)/2;
        update(l,m,i*2,x,y,v);
        update(m+1,r,i*2+1,x,y,v);
        t[i]=t[i*2]+t[i*2+1];
    }
    void update(int x,int y,ll v){
        update(1,n,1,x,y,v);
    }
    node query(int l,int r,int i,int x,int y){
        pushlz(l,r,i);
        if(y<l||r<x)return node();
        if(x<=l&&r<=y)return t[i];
        int m=(l+r)/2;
        return query(l,m,i*2,x,y)+query(m+1,r,i*2+1,x,y);
    }
    node query(int x,int y){
        return query(1,n,1,x,y);
    }
}s;

int main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    cin >> n >> d;
    for(int i=1;i<=n;i++)cin >> c[i];
    cin >> q;
    for(int i=1;i<=q;i++){
        int l,r;
        cin >> l >> r;
        qr[r].emplace_back(l,i);
    }
    s.build();
    for(int r=1;r<=n;r++){
        int p=r;
        ll val=c[r];
        while(!st.empty()){
            auto [x,y]=st.top();
            auto res=s.query(x,y);
            ll dif=res.mx-val;
            if(dif<=0)break;
            ll t=(dif-1)/d+1;
            s.update(x,y,t);
            p=x;
            val=res.mn-t*d;
            st.pop();
        }
        st.emplace(p,r);
        for(auto [l,i]:qr[r]){
            auto res=s.query(l,r);
            ans[i]=res.mn<0?-1:res.ans;
        }
    }
    for(int i=1;i<=q;i++)cout << ans[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...