#include <iostream>
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn = 2*1e5+5, INF = 4e18+9;
// Usage: RMQ<int, _min> rmq(a);
template<class T, T (*op) (T, T)> struct RMQ {
RMQ() = default;
RMQ(const vector<T>& v) : t{v}, n{(int) v.size()} {
for (int k = 1; (1<<k) <= n; ++k) {
t.emplace_back(n - (1<<k) + 1);
for (int i = 0; i + (1<<k) <= n; ++i) {
t[k][i] = op(t[k-1][i], t[k-1][i + (1<<(k-1))]);
}
}
}
// get range [l, r), doesn't work for empty range
T get(int l, int r) const {
assert(0 <= l && l < r && r <= n);
int k = __lg(r - l);
return op(t[k][l], t[k][r - (1<<k)]);
}
private:
vector<vector<T>> t;
int n;
};
template<class T> T _min(T a, T b) { return b < a ? b : a; }
template<class T> T _max(T a, T b) { return a < b ? b : a; }
void solve(){
ll n, D;
cin >> n >> D;
vector<ll> c(n+1);
for(int i = 1; i <= n; i++){
cin >> c[i];
}
vector<ll> b(n+1), a(n+1);
ll cur = 0;
b[0] = 0;
for(int i = 1; i <= n; i++){
b[i] = c[i]%D;
if(b[i] < b[i-1]){
b[i] += ((b[i-1] - b[i] - 1) / D + 1) * D;
}
}
for(int i = 1; i <= n; i++){
a[i] = (c[i]-b[i])/D;
}
vector<ll> pf(n+1, 0);
for(int i = 1; i <= n; i++){
pf[i] = pf[i-1] + a[i];
}
int B = 20;
vector<vector<pair<ll, ll>>> up(B+1, vector<pair<ll, ll>>(n+1, {0, 0}));
vector<int> st;
st.push_back(0);
a[0] = -INF;
vector<int> lt(n+1, 0);
for(int i = 1; i <= n; i++){
while(a[st.back()] >= a[i]){
st.pop_back();
}
lt[i] = st.back();
st.push_back(i);
}
for(int i = 1; i <= n; i++){
up[0][i] = {lt[i], (pf[i] - pf[lt[i]]) - a[i] * (i - lt[i])};
}
for(int j = 1; j <= B; j++){
for(int i = 1; i <= n; i++){
int v = up[j-1][i].first;
up[j][i] = {up[j-1][v].first, up[j-1][i].second+up[j-1][v].second};
}
}
RMQ<ll, _min> T(a);
int q;
cin >> q;
for(int it = 1; it <= q; it++){
int l, r;
cin >> l >> r;
if(T.get(l, r+1) + b[l]/D < 0){
cout << -1 << "\n";
continue;
}
ll ans = 0;
for(int j = 20; j >= 0; j--){
if(up[j][r].first+1 >= l){
ans += up[j][r].second;
r = up[j][r].first;
}
}
ans += (pf[r] - pf[l-1]) - a[r] * (r - l + 1);
cout << ans << "\n";
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
solve();
}
# | 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... |