看着第一篇题解对了好久
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2e5+5;
struct point{
int x, y, z, ans, w;
point(){
x = y = z = ans = w = 0;
}
}a[N], b[N];
int tr[N], ans[N];
int n_, n, k;
int lowbit(int x){
return x & (-x);
}
void add(int pos, int k){
for (int i = pos;i <= k;i += lowbit(i)) tr[i] += k;
}
int sum(int pos){
int res = 0;
for (int i = pos;i;i -= lowbit(i)) res += tr[i];
return res;
}
bool cmpx(point a, point b){
if (a.x == b.x){
if (a.y == b.y) return a.z < b.z;
return a.y < b.y;
}
return a.x < b.x;
}
bool cmpy(point a, point b){
if (a.y == b.y) return a.z < b.z;
return a.y < b.y;
}
void cdq(int l, int r){
if (l >= r) return;
//cout << l << ' ' << r << '\n';
int mid = (l + r) >> 1;
cdq(l, mid), cdq(mid + 1, r);
sort(a + l, a + mid + 1, cmpy);
sort(a + mid + 1, a + r + 1, cmpy);
int j = l, i = mid + 1;
for (;i <= r;i++){
while (a[j].y <= a[i].y && j <= mid){
add(a[j].z, a[j].w), ++j;
}
a[i].ans += sum(a[i].z);
}
for (i = l;i < j;i++) add(a[i].z, -a[i].w);
}
int main(){
cin >> n_ >> k;
for (int i = 1;i <= n_;i++){
cin >> b[i].x >> b[i].y >> b[i].z;
}
sort(b + 1, b + 1 + n_, cmpx);
int cnt = 0;
for (int i = 1;i <= n_;i++){
++cnt;
if (b[i].x != b[i + 1].x || b[i].y != b[i + 1].y || b[i].z != b[i + 1].z){
a[++n].x = b[i].x;
a[n].y = b[i].y;
a[n].z = b[i].z;
a[n].w = cnt;
cnt = 0;
}
}
cdq(1, n);
for (int i = 1;i <= n;i++){
ans[a[i].ans + a[i].w - 1] += a[i].w;
}
//cout << "-------------------------------------\n";
//for (int i = 1;i <= n;i++){
// cout << a[i].x << ' ' << a[i].y << ' ' << a[i].z << ' ' << a[i].ans << ' ' << a[i].w << '\n';
//}
for (int i = 0;i < n_;i++) cout << ans[i] << '\n';
return 0;
}