#include <bits/stdc++.h>
#define
using namespace std;
struct node {int l, r, w;}tree[A << 5];
int rt[A], cnt, n, m, ans[A];
void insert(int &k, int pre, int l, int r, int pos) {
k = ++cnt;
tree[k] = tree[pre]; tree[k].w++;
if (l == r) return;
int mid = (l + r) >> 1;
if (pos <= mid) insert(tree[k].l, tree[pre].l, l, mid, pos);
else insert(tree[k].r, tree[pre].r, mid + 1, r, pos);
}
int ask(int pos, int l, int r, int vl, int vr) {
if (l == r) return l;
int mid = (l + r) >> 1, sum = tree[tree[vr].l].w - tree[tree[vl].l].w;
if (pos <= sum) return ask(pos, l, mid, tree[vl].l, tree[vr].l);
else return ask(pos - sum, mid + 1, r, tree[vl].r, tree[vr].r);
}
struct Plank {int l, r, s;}p[A];
struct Bullet {
int x, pos;
friend bool operator < (const Bullet a, const Bullet b) {return a.x < b.x;}
}b[A];
int main(int argc, char const *argv[]) {
cin >> n >> m;
for (int i = 1; i <= n; i++) scanf("%d%d%d", &p[i].l, &p[i].r, &p[i].s);
for (int i = 1; i <= m; i++) scanf("%d", &b[i].x), b[i].pos = i;
sort(b + 1, b + m + 1);
for (int i = 1; i <= m; i++) insert(rt[i], rt[i - 1], 1, m, b[i].pos);
for (int i = 1; i <= n; i++) {
int vl = 1, vr = m, l = 0, r = 0;
while (vl <= vr) {
int mid = (vl + vr) >> 1;
if (b[mid].x >= p[i].l) l = mid, vr = mid - 1;
else vl = mid + 1;
}
r = upper_bound(b + 1, b + m + 1, p[i].r, [](int a, Bullet c) {return a < c.x;}) - b - 1;
if (r - l + 1 < p[i].s) continue;
ans[ask(p[i].s, 1, m, rt[l - 1], rt[r])]++;
}
for (int i = 1; i <= m; i++) printf("%d\n", ans[i]);
}