#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define vi vector<long long>
#define all(x) x.begin(), x.end()
#define endl "\n"
void solution();
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
solution();
return 0;
}
const int N = 1e6+10;
ll a[N];
ll h[N];
ll cnt[N];
ll res[N];
void solution() {
ll n, q; cin >> n >> q;
vi temp(n);
for (ll &z : temp) cin >> z;
int id = 0;
for (int i = 0; i < n; i++) {
if (a[id] != temp[i]) a[++id] = temp[i];
cnt[id]++;
}
n = id;
a[0] = a[n+1] = 1e18;
for (int i = 1; i < N; i++) cnt[i] += cnt[i-1];
stack<int> hs;
vi pg(n+1), ng(n+1);
hs.push(0);
for (int i = 1; i <= n; i++) {
while (a[hs.top()] < a[i]) hs.pop();
pg[i] = hs.top();
hs.push(i);
}
while (!hs.empty()) hs.pop();
hs.push(n+1);
for (int i = n; i >= 1; i--) {
while (a[hs.top()] <= a[i]) hs.pop();
ng[i] = hs.top();
hs.push(i);
}
auto val = [&](int i) {
ll l = cnt[i-1] - cnt[pg[i]];
ll r = cnt[ng[i]-1] - cnt[i];
ll m = cnt[i]-cnt[i-1];
return l*r + l*m + r*m + m*(m+1)/2;
};
for (int i = 1; i <= n; i++) {
res[a[i]] += val(i);
}
for (int i = 1; i < N; i++) res[i] += res[i-1];
while (q--) {
ll x; cin >> x;
cout << res[x] << endl;
}
}
| # | 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... |
| # | 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... |