Submission #1300725

#TimeUsernameProblemLanguageResultExecution timeMemory
1300725danglayloi1Fish 3 (JOI24_fish3)C++20
100 / 100
462 ms39808 KiB
#include <bits/stdc++.h>
#define ii pair<int, int>
#define fi first
#define se second
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
using ll = long long;
const ll mod=1e9+7;
const int nx=3e5+5;
int n, q;
ll d, a[nx], ans[nx], nod[nx<<2], la[nx<<2];
vector<ii> f[nx];
void down(int id, int l, int r, int mid)
{
    if(!la[id]) return;
    la[id<<1]+=la[id];
    la[id<<1|1]+=la[id];
    nod[id<<1]+=1ll*(mid-l+1)*la[id];
    nod[id<<1|1]+=1ll*(r-mid)*la[id];
    la[id]=0;
}
void update(int id, int l, int r, int u, int v, ll val)
{
    if(l>v || r<u) return;
    if(l>=u && r<=v)
    {
        la[id]+=val;
        nod[id]+=1ll*(r-l+1)*val;
        return;
    }
    int mid=(l+r)>>1;
    down(id, l, r, mid);
    update(id<<1, l, mid, u, v, val);
    update(id<<1|1, mid+1, r, u, v, val);
    nod[id]=nod[id<<1]+nod[id<<1|1];
}
ll get(int id, int l, int r, int u, int v)
{
    if(l>v || r<u) return 0;
    if(l>=u && r<=v) return nod[id];
    int mid=(l+r)>>1;
    down(id, l, r, mid);
    return get(id<<1, l, mid, u, v)+get(id<<1|1, mid+1, r, u, v);
}
ll solve(int i)
{
    return a[i]-d*get(1, 1, n, i, i);
}
stack<int> st;
int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin>>n>>d;
    for(int i = 1; i <= n; i++)
        cin>>a[i];
    cin>>q;
    for(int i = 1; i <= q; i++)
    {
        int l, r;
        cin>>l>>r;
        f[r].emplace_back(l, i);
    }
    for(int i = 1; i <= n; i++)
    {
        int cur=i;
        while(st.size())
        {
            int last=st.top();
            ll le=solve(cur-1), ri=solve(cur);
            if(le<=ri) break;
            ll need=(le-ri-1)/d+1;
            update(1, 1, n, last, cur-1, need);
            cur=last;
            st.pop();
        }
        st.push(cur);
        for(auto it:f[i])
            if(solve(it.fi)<0) ans[it.se]=-1;
            else ans[it.se]=get(1, 1, n, it.fi, i);
    }
    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...