#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = double;
const int MAXN = 3e5;
ll d;
struct LazySeg {
vector<ll> tree;
vector<ll> lz;
vector<ll> sum;
int n;
LazySeg(int n) {
this->n = n;
tree = vector<ll>(4 * n, LLONG_MAX);
lz = vector<ll>(4 * n, LLONG_MAX);
sum = vector<ll>(4 * n);
}
void upd(int i, int l, int r, ll val) {
tree[i] = min(tree[i], val);
lz[i] = min(lz[i], val);
sum[i] = tree[i] * (r - l + 1);
}
void push(int i, int l, int r) {
if (lz[i] == LLONG_MAX) return;
if (l < r) {
int m = (l + r) / 2;
upd(i * 2, l, m, lz[i]);
upd(i * 2 + 1, m + 1, r, lz[i]);
}
lz[i] = LLONG_MAX;
}
void update(int i, int l, int r, int ql, int qr, ll val) {
if (l > qr || r < ql) return;
if (ql <= l && r <= qr) {
tree[i] = val;
lz[i] = val;
sum[i] = val * (r - l + 1);
return;
}
push(i, l, r);
int m = (l + r) / 2;
update(i * 2, l, m, ql, qr, val);
update(i * 2 + 1, m + 1, r, ql, qr, val);
sum[i] = sum[i * 2] + sum[i * 2 + 1];
}
void update(int ql, int qr, ll val) {
update(1, 1, n, ql, qr, val);
}
ll query(int i, int l, int r, int ql, int qr) {
if (l > qr || r < ql) return 0;
if (ql <= l && r <= qr) {
return sum[i];
}
push(i, l, r);
int m = (l + r) / 2;
return query(i * 2, l, m, ql, qr) + query(i * 2 + 1, m + 1, r, ql, qr);
}
ll query(int ql, int qr) {
return query(1, 1, n, ql, qr);
}
};
int main() {
//~ ofstream cout("out.txt");
ios::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n >> d;
LazySeg tree(n);
vector<ll> a(n + 1);
vector<ll> ps(n + 1);
for (int i = 1; i <= n; ++i) {
cin >> a[i];
ps[i] = a[i] + ps[i - 1];
}
deque<pair<ll, int>> dq;
dq.push_back({-1, 0});
int q;
cin >> q;
vector<vector<pair<int, int>>> quer(n + 1);
vector<ll> res(q);
for (int i = 0; i < q; ++i) {
int l, r;
cin >> l >> r;
quer[r].push_back({l, i});
}
for (int i = 1; i <= n; ++i) {
while (dq.size() && dq.back().first >= a[i]) dq.pop_back();
assert(dq.size() > 0);
int ql = dq.back().second + 1;
dq.push_back({a[i], i});
tree.update(ql, i, a[i]);
//~ cerr << ql << " " << i << " = " << a[i] << "\n";
//~ cerr << "\n";
for (auto& [l, j] : quer[i]) {
//~ cerr << "Query = " << l << " " << i << " = " << tree.query(l, i) << "\n";
res[j] = ps[i] - ps[l - 1] - tree.query(l, i);
}
}
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... |