#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = double;
const int MAXN = 3e5;
ll d;
int main() {
//~ ofstream cout("out.txt");
ios::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n >> d;
vector<ll> a(n);
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
vector<ll> v(n);
for (int i = n - 2; i >= 0; --i) {
if (a[i + 1] <= a[i]) {
v[i] = v[i + 1] + (a[i] - a[i + 1] + d - 1) / d;
} else {
v[i] = v[i + 1] - (a[i + 1] - a[i]) / d;
}
}
vector<ll> ps(n + 1);
for (int i = 0; i < n; ++i) {
ps[i + 1] = ps[i] + v[i];
}
vector<pair<int, ll>> st = {{-1, 0}};
int q;
cin >> q;
vector<ll> res(q);
vector<vector<array<int, 2>>> quer(n);
for (int i = 0; i < q; ++i) {
int l, r;
cin >> l >> r;
--l; --r;
quer[r].push_back({l, i});
}
//~ for (int i = 0; i < n + 1; ++i) {
//~ cout << ps[i] << " ";
//~ }
//~ cout << "\n";
//~ for (int i = 0; i < n + 1; ++i) {
//~ cout << v[i] << " ";
//~ }
//~ cout << "\n";
const ll INF = 1e18;
for (int i = 0; i < n; ++i) {
while ((int)st.size() > 1 && v[st.back().first] >= v[i]) st.pop_back();
st.push_back({i, st.back().second + v[i] * (i - st.back().first)});
for (auto [l, qidx] : quer[i]) {
int idx = lower_bound(begin(st), end(st), make_pair(l, -INF)) - begin(st);
res[qidx] = st.back().second - st[idx - 1].second - v[st[idx].first] * (l - 1 - st[idx - 1].first);
res[qidx] = ps[i + 1] - ps[l] - res[qidx];
if (a[l] < d * (v[l] - v[st[idx].first])) res[qidx] = -1;
}
}
for (auto& u : res) {
cout << u << "\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... |