#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
struct DSU {
vector<int> parent;
vector<int> sz;
DSU(int n) {
parent.resize(n + 1);
sz.resize(n + 1, 1);
for (int i = 1; i <= n; i++) parent[i] = i;
}
int find(int i) {
if (parent[i] == i) return i;
return parent[i] = find(parent[i]);
}
void unite(int i, int j) {
int root_i = find(i);
int root_j = find(j);
if (root_i != root_j) {
parent[root_i] = root_j;
sz[root_j] += sz[root_i];
}
}
};
ll calculate_flights(ll L) {
return (L * (L + 1)) / 2;
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int N, Q;
cin >> N >> Q;
vector<pair<int, int>> mountains(N);
for (int i = 0; i < N; i++) {
cin >> mountains[i].first;
mountains[i].second = i + 1;
}
sort(mountains.begin(), mountains.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<bool> active(N + 2, false);
vector<ll> results(Q);
ll current_ans = 0;
int m_idx = 0;
for (int i = 0; i < Q; i++) {
int limit = queries[i].first;
while (m_idx < N && mountains[m_idx].first <= limit) {
int pos = mountains[m_idx].second;
active[pos] = true;
current_ans += calculate_flights(1);
if (active[pos - 1]) {
ll sz_left = dsu.sz[dsu.find(pos - 1)];
ll sz_curr = dsu.sz[dsu.find(pos)];
current_ans -= calculate_flights(sz_left);
current_ans -= calculate_flights(sz_curr);
dsu.unite(pos - 1, pos);
current_ans += calculate_flights(dsu.sz[dsu.find(pos)]);
}
if (active[pos + 1]) {
ll sz_right = dsu.sz[dsu.find(pos + 1)];
ll sz_curr = dsu.sz[dsu.find(pos)];
current_ans -= calculate_flights(sz_right);
current_ans -= calculate_flights(sz_curr);
dsu.unite(pos + 1, pos);
current_ans += calculate_flights(dsu.sz[dsu.find(pos)]);
}
m_idx++;
}
results[queries[i].second] = current_ans;
}
for (ll res : results) cout << res << "\n";
return 0;
}