1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
| #include<bits/stdc++.h> using namespace std; const int MAXn = 1e5; const int MAXa = 2e5;
template <typename T> inline void read(T &a) { char c;for (c = getchar(); (c < '0' || c > '9') && c != '-'; c = getchar());bool f = c == '-';T x = f ? 0 : (c ^ '0');for (c = getchar(); c >= '0' && c <= '9'; c = getchar()) {x = x * 10 + (c ^ '0');}a = f ? -x : x; } template <typename T, typename ...Argv> inline void read(T &a, Argv &...argv) { read(a), read(argv...); }
int n, mxa;
int t[MAXa + 10]; inline int lowbit(int x) { return x & -x; } inline void modify(int p, int v, int n) { while (p <= n) { t[p] += v; p += lowbit(p); } } inline int query(int p) { int ans = 0; while (p) { ans += t[p]; p -= lowbit(p); } return ans; }
struct Ele { int cnt, idx; int a, b, c; inline bool operator==(const Ele sec) const { return a == sec.a && b == sec.b && c == sec.c; } }; inline bool cmpc(Ele fir, Ele sec) { if (fir.c != sec.c) return fir.c < sec.c; else if (fir.b != sec.b) return fir.b < sec.b; else return fir.a < sec.a; } inline bool cmpb(Ele fir, Ele sec) { if (fir.b != sec.b) return fir.b < sec.b; else return fir.a < sec.a; } Ele tmpele[MAXn + 10]; int cntele; Ele ele[MAXn + 10];
int idx[MAXn + 10], ans[MAXn + 10]; void cdq(int l, int r) { if (l == r) return; else { int mid = (l + r) >> 1; cdq(l, mid); cdq(mid + 1, r); int i = l; for (int j = mid + 1; j <= r; ++j) { while (i <= mid && ele[i].b <= ele[j].b) { modify(ele[i].a, ele[i].cnt, mxa); ++i; } ans[ele[j].idx] += query(ele[j].a); } for (int k = l; k < i; ++k) { modify(ele[k].a, -ele[k].cnt, mxa); } inplace_merge(ele + l, ele + 1 + mid, ele + 1 + r, cmpb); } }
int bucans[MAXn + 10]; signed main() { read(n, mxa); for (int i = 1; i <= n; ++i) { read(tmpele[i].a, tmpele[i].b, tmpele[i].c); tmpele[i].cnt = 1; } sort(tmpele + 1, tmpele + 1 + n, cmpc); for (int i = 1; i <= n; ++i) { if (cntele && ele[cntele] == tmpele[i]) ++ele[cntele].cnt; else { ++cntele; ele[cntele] = tmpele[i]; ele[cntele].idx = cntele; } idx[i] = cntele; } for (int i = 1; i <= cntele; ++i) { ans[i] = ele[i].cnt - 1; } cdq(1, cntele); for (int i = 1; i <= n; ++i) { ++bucans[ans[idx[i]]]; } for (int i = 0; i < n; ++i) { printf("%d\n", bucans[i]); } return 0; }
|