#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int, int>

template<class T>
struct Fen {
    int n;
    vector<T> t;
    Fen (int n_) {
        init(n_);
    }
    Fen () {};
    void init(int n_) {
        n = n_;
        t.assign(n + 1, {});
    }
    void change(int u, T x) {
        for(; u <= n; u += u & -u) t[u] += x;
    }
    T sum(int u) {
        T res = 0;
        for(; u; u -= u & -u) res += t[u];
        return res;
    }
};


struct Node {
    int a, b, c, i;
};

bool cmpa(const Node &a, const Node &b) {
    return a.a < b.a;
}

bool cmpb(const Node &a, const Node &b) {
    return a.b < b.b;
}
void solve() {
    int n, N;
    cin >> n >> N;

    vector<Node> a(n);
    vector<int> ans(n + 1);
    for (int i = 1; i <= n; i++) {
        int x, b, c; cin >> x >> b >> c;
        a[i - 1] = {x, b, c, i};
    }

    sort(a.begin(), a.end(), cmpa);

    Fen<int> t(N);
    function<void(int, int)> cdq = [&] (int l, int r) {
        if (l == r) return;
        int m = l + r >> 1;
        cdq(l, m); cdq(m + 1, r);
        sort(a.begin() + l, a.begin() + m + 1, cmpb);
        sort(a.begin() + m + 1, a.begin() + r + 1, cmpb);

        vector<int> clr;
        for (int j = m + 1, i = l; j <= r; j++) {
            while (i <= m && a[i].b <= a[j].b) {
                t.change(a[i].c, 1);
                clr.push_back(a[i].c);
                i++;
            }
            ans[a[j].i] += t.sum(a[j].c);
        }
        for (auto x : clr) t.change(x, -1);

        int mn = N;
        for (int i = m + 1; i <= r; i++) {
            mn = min(mn, a[i].a);
        }

        clr.clear();
        for (int i = l, j = m + 1; i <= m; i++) {
            while (j <= r) {
                if (a[j].a != mn) {
                    j++;
                } else {
                    if (a[j].b <= a[i].b) {
                        t.change(a[j].c, 1);
                        clr.push_back(a[j].c);
                        j++;
                    } else {
                        break;
                    }
                }
            }
            if (a[i].a == mn) {
                ans[a[i].i] += t.sum(a[i].c);
            }
        }
        for (auto x : clr) t.change(x, -1);


    };

    cdq(0, (int)a.size() - 1);
    vector<int> d(n);
    for (int i = 1; i <= n; i++) {
        d[ans[i]]++;
    }
    for (auto x : d) cout << x << '\n';
}
signed main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int t = 1;
    // cin >> t;
    while (t--) solve();
    return 0;
}
/*
g++ -std=c++14 1.cpp -o 1 && 1 < in.txt > out.txt
g++ -std=c++17 1.cpp -o 1 && ./1 < in.txt > out.txt

*/

0 条评论

目前还没有评论...

信息

ID
548
时间
ms
内存
MiB
难度
7
标签
递交数
12
已通过
8
上传者