#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 time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |