#include <bits/stdc++.h>
using namespace std;
struct DSU {
vector<int> parent, size;
DSU(int n) {
parent.resize(n);
size.assign(n, 0);
iota(parent.begin(), parent.end(), 0);
}
int find(int x) {
if (parent[x] == x) return x;
return parent[x] = find(parent[x]);
}
long long merge(int a, int b, long long &total) {
a = find(a); b = find(b);
if (a == b) return total;
// remove old contributions
total -= 1LL * size[a] * (size[a] + 1) / 2;
total -= 1LL * size[b] * (size[b] + 1) / 2;
// merge
parent[b] = a;
size[a] += size[b];
// add new contribution
total += 1LL * size[a] * (size[a] + 1) / 2;
return total;
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, Q;
cin >> N >> Q;
vector<int> H(N);
for (int i = 0; i < N; i++) cin >> H[i];
vector<int> Y(Q);
for (int i = 0; i < Q; i++) cin >> Y[i];
// Sort mountains by height
vector<pair<int,int>> mountains;
for (int i = 0; i < N; i++) mountains.push_back({H[i], i});
sort(mountains.begin(), mountains.end());
// Sort queries with original index
vector<pair<int,int>> queries;
for (int i = 0; i < Q; i++) queries.push_back({Y[i], i});
sort(queries.begin(), queries.end());
DSU dsu(N);
vector<bool> active(N, false);
vector<long long> ans(Q);
long long total = 0;
int ptr = 0;
for (auto [y, idx] : queries) {
// activate mountains with height <= y
while (ptr < N && mountains[ptr].first <= y) {
int pos = mountains[ptr].second;
active[pos] = true;
dsu.size[pos] = 1;
total += 1; // single mountain flight
// merge with left neighbor
if (pos > 0 && active[pos-1]) dsu.merge(pos, pos-1, total);
// merge with right neighbor
if (pos+1 < N && active[pos+1]) dsu.merge(pos, pos+1, total);
ptr++;
}
ans[idx] = total;
}
for (int i = 0; i < Q; i++) cout << ans[i] << "\n";
return 0;
}