#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct DSU {
vector<int> parent, sz;
vector<bool> active;
ll ans = 0;
DSU(int n) {
parent.resize(n + 1);
sz.assign(n + 1, 1);
active.assign(n + 1, false);
for (int i = 1; i <= n; i++) parent[i] = i;
}
int find(int x) {
if (parent[x] == x) return x;
return parent[x] = find(parent[x]);
}
ll calc(ll s) {
return s * (s + 1) / 2;
}
void unite(int a, int b) {
a = find(a);
b = find(b);
if (a == b) return;
// remove old contributions
ans -= calc(sz[a]);
ans -= calc(sz[b]);
parent[b] = a;
sz[a] += sz[b];
// add new contribution
ans += calc(sz[a]);
}
void activate(int i) {
active[i] = true;
ans += 1; // single node: 1 subarray
if (i > 1 && active[i - 1]) unite(i, i - 1);
if (active[i + 1]) unite(i, i + 1);
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, Q;
cin >> N >> Q;
vector<int> H(N + 1);
for (int i = 1; i <= N; i++) cin >> H[i];
vector<pair<int,int>> order;
for (int i = 1; i <= N; i++) {
order.push_back({H[i], i});
}
sort(order.begin(), order.end());
vector<pair<int,int>> queries(Q);
for (int i = 0; i < Q; i++) {
cin >> queries[i].first;
queries[i].second = i;
}
sort(queries.begin(), queries.end());
DSU dsu(N);
vector<ll> ans(Q);
int ptr = 0;
for (auto [Y, idx] : queries) {
while (ptr < N && order[ptr].first <= Y) {
dsu.activate(order[ptr].second);
ptr++;
}
ans[idx] = dsu.ans;
}
for (int i = 0; i < Q; i++) {
cout << ans[i] << "\n";
}
return 0;
}