/**
* author: tourist
* created: 19.04.2025 09:45:38
**/
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#include "algo/debug.h"
#else
#define debug(...) 42
#endif
#define int long long
int32_t main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, d;
cin >> n >> d;
vector<int> c(n);
for (int i = 0; i < n; i++) {
cin >> c[i];
}
vector<long long> v(n);
for (int i = n - 2; i >= 0; i--) {
if (c[i] >= c[i + 1]) {
v[i] = v[i + 1] + (c[i] - c[i + 1] + d - 1) / d;
} else {
v[i] = v[i + 1] - (c[i + 1] - c[i]) / d;
}
}
vector<long long> p(n + 1);
for (int i = 0; i < n; i++) {
p[i + 1] = p[i] + v[i];
}
vector<vector<pair<int, int>>> query(n);
int q;
cin >> q;
for (int qq = 0; qq < q; qq++) {
int l, r;
cin >> l >> r;
--l; --r;
query[r].emplace_back(l, qq);
}
vector<long long> ans(q);
vector<pair<int, long long>> st;
st.emplace_back(-1, 0);
for (int i = 0; i < n; i++) {
while (st.size() > 1 && v[st.back().first] >= v[i]) {
st.pop_back();
}
st.emplace_back(i, st.back().second + (int64_t(v[i]) * int64_t(i - st.back().first)));
for (auto [l, qi] : query[i]) {
int id = lower_bound(st.begin(), st.end(), make_pair(l, -1LL)) - st.begin();
ans[qi] = p[i + 1] - p[l] - (st.back().second - st[id - 1].second - int64_t(v[st[id].first]) * int64_t(l - 1 - st[id - 1].first));
if (c[l] < int64_t(d) * int64_t(v[l] - v[st[id].first])) {
ans[qi] = -1;
}
}
}
for (int i = 0; i < q; i++) {
cout << ans[i] << '\n';
}
return 0;
}
# | 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... |