rt,用的整体二分
#include <bits/stdc++.h>
#define pii pair<int,int>
using namespace std;
#define int long long
const int MAXN = 2e5 + 10;
int c[MAXN], n, m, clk, ver[MAXN], mx;
void update(int i, int v) {
for (; i <= mx; i += i & -i) {
if (ver[i] != clk)
ver[i] = clk, c[i] = 0;
c[i] += v;
}
}
int query(int i) {
int ret = 0;
for (; i; i -= i & -i) {
if (ver[i] != clk)
ver[i] = clk, c[i] = 0;
ret += c[i];
}
return ret;
}
struct Q {
int l, r, s, id;
} q[MAXN];
int now[MAXN], s[MAXN], ans[MAXN], a[MAXN];
void solve(int l, int r, int ql, int qr) {
if(ql>qr) return;
if(l>r) return;
clk++;
if (l == r) {
for (int i = ql; i <= qr; i++) {
ans[r] += q[i].s == 1ll;
}
return;
}
int mid = (l + r) / 2ll;
int midq = ql - 1ll;
for (int i = l; i <= mid; i++)
update(a[i], 1ll);
for (int i = ql; i <= qr; i++) {
int cnt = query(q[i].r) - query(q[i].l - 1);
if (cnt >= q[i].s) {
midq++;
swap(q[midq], q[i]);
}
else q[i].s -= cnt;
}
solve(l, mid, ql, midq);
solve(mid + 1ll, r, midq + 1ll, qr);
}
signed main() {
scanf("%lld %lld", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%lld %lld %lld", &q[i].l, &q[i].r, &q[i].s);
mx = max({mx, q[i].l, q[i].r, q[i].s});
q[i].id = i;
}
for (int i = 1; i <= m; i++) {
scanf("%lld", a + i);
mx = max(a[i], mx);
}
solve(1ll, m, 1ll, n);
for (int i = 1; i <= m; i++) {
printf("%lld\n", ans[i]);
}
return 0;
}