Submission #1265852

#TimeUsernameProblemLanguageResultExecution timeMemory
1265852huyjavaltPlahte (COCI17_plahte)C++20
160 / 160
341 ms117328 KiB
#include <bits/stdc++.h>
using namespace std;

#define double long double
#define int long long

struct Line{
    int x,l,r,i,t;
    // t = 0 -> left side
    // t = 2 -> right side
    // t = 1 -> query;

    bool operator<(const Line& other) const{
        if(x == other.x) return t > other.t;
        return x < other.x;
    }
};

vector<Line> ev;
vector<int> com;

vector<int> t[1000005];

void update(int v, int tl, int tr, int l, int r, int x){
    if(l > tr || r < tl) return;
    if(l <= tl && tr <= r){
        if(x) t[v].push_back(x);
        else t[v].pop_back();
        //cout << tl << ' ' << tr << ' ' << x << ' ' << "ADD" << endl;
        return;
    }
    int tm = (tl+tr)/2;
    update(v*2,tl,tm,l,r,x);
    update(v*2+1,tm+1,tr,l,r,x);
}

int query(int v, int tl, int tr, int l, int r){
    if(l > tr || r < tl) return 0;
    if(l <= tl && tr <= r) return (t[v].size() ? t[v].back() : 0);

    int tm = (tl+tr)/2;

    int res = query(v*2,tl,tm,l,r);
    if(!res) res = query(v*2+1,tm+1,tr,l,r);
    if(!res) res = (t[v].size() ? t[v].back() : 0);
    return res;
}

vector<int> adj[800005];
set<int> col[800005];
int ans[800005];

void dfs(int v){
    for(auto u : adj[v]){
        dfs(u);
        if(col[u].size() > col[v].size()) col[v].swap(col[u]);
        for(auto i : col[u]) col[v].insert(i);
    }
    ans[v] = col[v].size();
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
//    freopen("squares.in","r",stdin);
//    freopen("squares.out","w",stdout);

    int n,m;
    cin >> n >> m;

    for(int i = 1; i <= n; i++){
        int x,y,u,v;
        cin >> x >> y >> u >> v;
        ev.push_back({x,y,v,i,2});
        ev.push_back({u,y,v,i,0});
        com.push_back(y); com.push_back(v);
    }

    for(int i = 1; i <= m; i++){
        int x,y,k;
        cin >> x >> y >> k;
        ev.push_back({x,y,y,k,1});
        com.push_back(y);
    }

    sort(com.begin(), com.end());
    sort(ev.begin(), ev.end());
    com.erase(unique(com.begin(), com.end()), com.end());

    for(auto &p : ev){
        p.l = lower_bound(com.begin(), com.end(), p.l) - com.begin() + 1;
        p.r = lower_bound(com.begin(), com.end(), p.r) - com.begin() + 1;
        //cout << p.x << ' ' << p.l << ' ' << p.r << ' ' << p.t << ' ' << p.i << endl;

        if(p.t == 2){
            int par = query(1,1,com.size(),p.l,p.r);
            update(1,1,com.size(),p.l,p.r,p.i);
            adj[par].push_back(p.i);
            //cout << par << ' ' << p.i << ' ' << "TREE" << endl;

        }
        if(p.t == 0) update(1,1,com.size(),p.l,p.r,0);
        if(p.t == 1){
            //cout << query(1,1,com.size(),p.l,p.r) << ' ' << p.i << " COL" << endl;
            col[query(1,1,com.size(),p.l,p.r)].insert(p.i);
        }
    }

    dfs(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...