萌新学整体二分,wa掉后听LZY大佬提醒将值域右边界加了一,但是样例就wa了。可是我这么一试,竟然AC了?!?连hack都过了?!?求助各位大佬帮忙看看哪里的问题…………
#include <bits/stdc++.h>
struct Query {
int l, r, x, id;
} q[400005], q1[400005], q2[400005];
int n, m, ans[200005], tr[200005];
void add(int x, int v) {
for (; x <= m; x += x & -x) tr[x] += v;
}
int query(int x) {
int res = 0;
for (; x; x -= x & -x) res += tr[x];
return res;
}
void solve(int l, int r, int L, int R) {
if (L > R) return ;
if (l == r) {
for (int i = L; i <= R; i++) {
if (!q[i].id) {
ans[l]++;
}
}
return ;
}
int mid = (l + r) / 2, sz1 = 0, sz2 = 0;
for (int i = L; i <= R; i++) {
if (q[i].id) {
if (q[i].id <= mid) add(q[i].x, 1), q1[++sz1] = q[i];
else q2[++sz2] = q[i];
}
else {
int tmp = query(q[i].r) - query(q[i].l - 1);
if (q[i].x <= tmp) q1[++sz1] = q[i];
else q[i].x -= tmp, q2[++sz2] = q[i];
}
}
for (int i = L; i <= R; i++) {
if (q[i].id && q[i].id <= mid) {
add(q[i].x, -1);
}
}
for (int i = L; i <= R; i++) {
if (i - L + 1 <= sz1) q[i] = q1[i - L + 1];
else q[i] = q2[i - L - sz1 + 1];
}
solve(l, mid, L, L + sz1 - 1), solve(mid + 1, r, L + sz1, R);
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d %d %d", &q[m + i].l, &q[m + i].r, &q[m + i].x);
for (int i = 1; i <= m; i++) scanf("%d", &q[i].x), q[i].id = i;
solve(1, m + 1, 1, n + m);
for (int i = 1; i <= m; i++) printf("%d\n", ans[i]);
return 0;
}
STO sto LZY AK IOI JF orz OTZ