Submission #1366298

#TimeUsernameProblemLanguageResultExecution timeMemory
1366298nguyenkhangninh99Plahte (COCI17_plahte)C++20
160 / 160
173 ms26124 KiB
#include<bits/stdc++.h>
using namespace std;

const int maxn = 8e4 + 5;
int st[12 * maxn], lazy[12 * maxn];

void push(int id){
    if(lazy[id]){
        st[id * 2] = st[id * 2 + 1] = st[id];
        lazy[id * 2] = lazy[id * 2 + 1] = 1;
        lazy[id] = 0;
    }
}
void update(int id, int l, int r, int u, int v, int val){
    if(v < l || r < u) return;
    if(u <= l && r <= v){
        st[id] = val;
        lazy[id] = 1;
        return;
    }
    push(id);
    int mid = (l + r) / 2;
    update(id * 2, l, mid, u, v, val);
    update(id * 2 + 1, mid + 1, r, u, v, val);
}
int query(int id, int l, int r, int pos){
    if (l == r) return st[id];
    push(id);
    int mid = (l + r) / 2;
    if(pos <= mid) return query(id * 2, l, mid, pos);
    return query(id * 2 + 1, mid + 1, r, pos);
}
vector<int> at[maxn], adj[maxn], col;
int last[maxn], ans[maxn], par[maxn];
int tin[maxn], out[maxn], timedfs;

void dfs(int u) {
    tin[u] = timedfs + 1;
    for(int c: at[u]){
        timedfs++;
        col.push_back(c);
    }
    for(int v: adj[u]) dfs(v);
    out[u] = timedfs;
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    
    int n, m; cin >> n >> m;
    
    vector<int> compressy;
    vector<array<int, 3>> event;
    
    vector<int> x1(n + 1), y1(n + 1), x2(n + 1), y2(n + 1);
    for(int i = 1; i <= n; i++){
        cin >> x1[i] >> y1[i] >> x2[i] >> y2[i];
        event.push_back({x1[i], 0, i});
        event.push_back({x2[i], 2, i});
        compressy.push_back(y1[i]);
        compressy.push_back(y2[i]);
    }
    vector<int> x(m + 1), y(m + 1), c(m + 1), compressc;
    for(int i = 1; i <= m; i++){
        cin >> x[i] >> y[i] >> c[i];
        event.push_back({x[i], 1, i});
        compressy.push_back(y[i]);
        compressc.push_back(c[i]);
    }
    sort(event.begin(), event.end());

    sort(compressc.begin(), compressc.end());
    compressc.erase(unique(compressc.begin(), compressc.end()), compressc.end());
    for(int i = 1; i <= m; i++) c[i] = lower_bound(compressc.begin(), compressc.end(), c[i]) - compressc.begin() + 1;

    sort(compressy.begin(), compressy.end());
    compressy.erase(unique(compressy.begin(), compressy.end()), compressy.end());
    auto idy = [&](int y){
        return lower_bound(compressy.begin(), compressy.end(), y) - compressy.begin();
    };
    int sz = compressy.size();
    
    for(auto [x, type, i]: event){
        if(type == 0){
            par[i] = query(1, 0, sz - 1, idy(y1[i]));
            update(1, 0, sz - 1, idy(y1[i]), idy(y2[i]), i);   
        }else if(type == 1) at[query(1, 0, sz - 1, idy(y[i]))].push_back(c[i]);   
        else update(1, 0, sz - 1, idy(y1[i]), idy(y2[i]), par[i]);
    }
    
    for(int i = 1; i <= n; i++) adj[par[i]].push_back(i);
    dfs(0);

    vector<array<int, 3>> qry;
    for(int i = 1; i <= n; i++){
        if(tin[i] <= out[i]) qry.push_back({out[i], tin[i], i});
    }
    sort(qry.begin(), qry.end());
    
    vector<int> fenwick(timedfs + 1);
    auto add = [&](int p, int v){
        for (; p <= timedfs; p += p & -p) fenwick[p] += v;
    };
    auto get = [&](int p){
        int sum = 0;
        for (; p; p -= p & -p) sum += fenwick[p];
        return sum;
    };

    for(int i = 1, j = 0; i <= timedfs; i++){
        int c = col[i - 1];
        if(last[c]) add(last[c], -1);
        last[c] = i;
        add(i, 1);
        
        while(j < qry.size() && qry[j][0] == i){
            ans[qry[j][2]] = get(i) - get(qry[j][1] - 1);
            j++;
        }
    }
    for(int i = 1; i <= n; i++) cout << ans[i] << "\n";
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...