对拍找不出错:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5;
int n, k, m, ans[N + 5];
template <typename T>
struct BIT {
T a[(N << 1) + 5];
#define lowbit(x) ((x) & -x)
void add(int pos, T val) {
for (int i = pos; i <= k; i += lowbit(i)) a[i] += val;
}
T query(int pos) {
T res = 0;
for (int i = pos; i > 0; i -= lowbit(i)) res += a[i];
return res;
}
};
struct Elem {
int a, b, c;
int cnt, res;
bool operator != (const Elem& other) const {
return a != other.a || b != other.b || c != other.c;
}
};
bool cmp1(Elem a, Elem b) {
if (a.a != b.a) return a.a < b.a;
if (a.b != b.b) return a.b < b.b;
return a.c < b.c;
}
bool cmp2(Elem a, Elem b) {
if (a.b != b.b) return a.b < b.b;
return a.c < b.c;
}
Elem a[N], b[N];
BIT <int> bit;
void CDQ(int l, int r) {
if (l == r) return;
int mid = (l + r) >> 1;
CDQ(l, mid);
CDQ(mid + 1, r);
sort(b + l, b + mid + 1, cmp2);
sort(b + mid + 1, b + r + 1, cmp2);
int i = l, j = mid + 1;
for (; j <= r; j++) {
for (; i <= mid && b[i].b <= b[j].b; i++)
bit.add(b[i].c, b[i].cnt);
b[j].res += bit.query(b[j].c);
}
for (int k = l; k < i; k++) bit.add(b[k].c, -b[k].cnt);
}
main() {
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; i++)
scanf("%d%d%d", &a[i].a, &a[i].b, &a[i].c);
sort(a + 1, a + n + 1, cmp1);
for (int i = 1, t = 0; i <= n; i++) {
++t;
if (a[i] != a[i + 1])
++m, b[m] = a[i], b[m].cnt = t, b[m].res = 0, t = 0;
}
CDQ(1, m);
for (int i = 1; i <= m; i++)
ans[b[i].res + b[i].cnt - 1] += b[i].cnt;
for (int i = 0; i < n; i++)
printf("%d\n", ans[i]);
}