Submission #1208271

#TimeUsernameProblemLanguageResultExecution timeMemory
1208271urejgiPlahte (COCI17_plahte)C++17
160 / 160
284 ms85652 KiB
#pragma GCC optimize("O3,unroll-loops,fast-math")
#pragma GCC target("avx,avx2,bmi,bmi2,popcnt,lzcnt,tune=native,fma")
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int N = 5e5;

struct ST{
    int n;
    vector<int> tr, lz;
    void init(int _n){
        n = _n;
        tr.resize(n<<2|1);
        lz.assign(n<<2|1, 1);
    }
    void push(int t){
        if (lz[t]) return;
        tr[t<<1] = tr[t];
        tr[t<<1|1] = tr[t];
        lz[t<<1] = lz[t<<1|1] = 0;
        lz[t] = 1;
    }
    void add(int t, int l, int r, int ql, int qr, int x){
        if (r < ql || l > qr) return;
        if (ql <= l&& r <= qr){
            tr[t] = x;
            lz[t] = 0;
            return;
        }
        push(t);
        int m = (l + r) >> 1;
        add(t<<1, l, m, ql, qr, x);
        add(t<<1|1, m + 1, r, ql, qr, x);
    }
    int get(int t, int l, int r, int i){
        if (l == r) return tr[t];
        push(t);
        int m = (l + r) >> 1;
        if (i <= m) return get(t<<1, l, m, i);
        return get(t<<1|1, m + 1, r, i);
    }
    void add(int l, int r, int x){ add(1, 1, n, l, r, x); }
    int get(int i){ return get(1, 1, n, i); }
} tree;

struct event{
    int a, b, c, i;
    event(int _a = 0, int _b = 0, int _c = 0, int _d = 0):a(_a), b(_b), c(_c), i(_d){}
    bool operator<(const event&b) const{
        if (a == b.a){
            if (i < 0) return 0;
            if (b.i < 0) return 1;
            return c < b.c;
        }
        return a < b.a;
    }
};

struct S{
    int a, b, c, d;
    S(int _a = 0, int _b = 0, int _c = 0, int _d = 0):a(_a), b(_b), c(_c), d(_d){}
};

struct ball{
    int a, b, c;
    ball(int _a = 0, int _b = 0, int _c = 0):a(_a), b(_b), c(_c){}
};

int n, m, pa[N], pb[N], ans[N];
S a[N];
ball b[N];
set<int> col[N];
vector<event> evs;
vector<int> zip, g[N];

inline int pos(int x){
    return upper_bound(zip.begin(), zip.end(), x) - zip.begin();
}

signed main(){
    cin.tie(0)->sync_with_stdio(0);
    cin >> n >> m;
    zip.reserve(4*n + 2*m + 100);
    for(int i = 1; i <= n; ++i){
        cin >> a[i].a >> a[i].b >> a[i].c >> a[i].d;
        zip.push_back(a[i].a);
        zip.push_back(a[i].b);
        zip.push_back(a[i].c);
        zip.push_back(a[i].d);
    }
    for(int i = 1; i <= m; ++i){
        cin >> b[i].a >> b[i].b >> b[i].c;
        zip.push_back(b[i].a);
        zip.push_back(b[i].b);
    }
    sort(zip.begin(), zip.end());
    zip.erase(unique(zip.begin(), zip.end()), zip.end());
    tree.init(zip.size());
    for(int i = 1; i <= n; ++i){
        a[i].a = pos(a[i].a);
        a[i].b = pos(a[i].b);
        a[i].c = pos(a[i].c);
        a[i].d = pos(a[i].d);
    }
    for(int i = 1; i <= m; ++i){
        b[i].a = pos(b[i].a);
        b[i].b = pos(b[i].b);
    }
    for(int i = 1; i <= n; ++i){
        evs.emplace_back(a[i].a, a[i].b, a[i].d, i);
        evs.emplace_back(a[i].c, a[i].b, a[i].d, -i);
    }
    for(int i = 1; i <= m; ++i){
        evs.emplace_back(b[i].a, b[i].b, N, i);
    }
    sort(evs.begin(), evs.end());
    for(auto&tmp:evs){
        if (tmp.c == N){
            pb[tmp.i] = tree.get(tmp.b);
            col[pb[tmp.i]].insert(b[tmp.i].c);
            continue;
        }
        if (tmp.i < 0){
            tree.add(tmp.b, tmp.c, pa[-tmp.i]);
        } else{
            pa[tmp.i] = tree.get(tmp.b); 
            g[pa[tmp.i]].push_back(tmp.i);
            tree.add(tmp.b, tmp.c, tmp.i);
        }
    }
    function<void(int, int)> dfs = [&](int v, int pv) -> void{
        for(int u:g[v])
            if (u != pv){
                dfs(u, v);
                if (col[v].size() < col[u].size())
                    swap(col[v], col[u]);
                for(int x:col[u])
                    col[v].insert(x);
            }
        ans[v] = col[v].size();
    };
    dfs(0, 0);
    for(int i = 1; i <= n; ++i) cout<<ans[i]<<'\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...