Submission #524351

#TimeUsernameProblemLanguageResultExecution timeMemory
524351IMysticBall Machine (BOI13_ballmachine)C++17
8.57 / 100
121 ms44016 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N = 100010, INF = 1000000000;
vector<int> adj[N];
vector<int> pref(N, INF), dist(N, INF);
vector<int> order, lca;

void dfs(int n, int par){
    sort(adj[n].begin(), adj[n].end(), [](int a, int b){return pref[a] < pref[b];});
    if(par != -1)dist[n] = dist[par] + 1;
    for(int c : adj[n]){
        if(c != par){
            dfs(c, n);
        }
    }
    order.push_back(n);
}



template <class S> 
struct segment {
public :

    explicit segment(int _n) : n(_n) {
        log = 1;
        while((1<<log) < n)++log;
        size = 1 << log;
        d.resize(2*size);

        for(int i=0; i<n; i++)d[i + size] = S(0, 1, i);
        for(int i=size - 1; i >= 1; i--)update(i);
    }

    S get(int p){
        assert(0 <= p && p < n);
        return d[p + size];
    }

    void set(int p, S v){
        assert(0 <= p && p < n);
        p += size;
        
        d[p] = v;
        for(int i=1; i<=log; i++)update(p>>i);
    }

    S get(int l, int r){
        assert(0 <= l && l <= r && r <= n);
        if(l == r)return S();
        l += size;
        r += size;

        S sml = S(), smr = S();
        while(l < r){
            if(l&1) sml = sml + d[l++];
            if(r&1) smr = d[--r] + smr;

            l >>= 1;
            r >>= 1;
        }

        return sml + smr;
    }

private :

    int n, log, size;
    vector<S> d;
    void update(int p){ d[p] = d[2*p] + d[2*p + 1]; }
};


struct node {
    int sm, sz, fi;
    explicit node(int s = 0,int l = 0,int f = INF) : sm(s), sz(l), fi(f) {};
    node operator +(const node &other){
        node res;
        res.sm = sm + other.sm;
        res.sz = sz + other.sz;
        res.fi = min(fi, other.fi);

        return res;
    }
};


int main(){
    ios_base :: sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m, root;
    cin >> n >> m;
    vector<int> p(n);
    for(int i=0; i<n; i++){
        cin >> p[i];
        --p[i];
        if(p[i] != -1){
            adj[i].push_back(p[i]);
            adj[p[i]].push_back(i);
        }else root = i;
    }
    
    {   
        int c = 0;
        for(int i=0; i<n; i++){
            int curr = 0;
            while(curr != -1){
                if(pref[curr] < c)break;
                pref[curr] = c;
                curr = p[curr];
            }
            ++c;
        }
    }
    
    vector<int> id(n);
    dist[root] = 0;
    dfs(root, -1);
    for(int i=0; i<n; i++)id[order[i]] = i;

    set<int> tofill;
    for(int i=0; i<n; i++)tofill.insert(i);

    segment<node> K(n);
    for(int i=0; i<m; i++){
        int t, x;
        cin >> t >> x;
        if(t & 1){
            assert(x <= tofill.size());
            vector<int> tem;
            auto it = tofill.begin();
            for(int i=0; i<x; i++){
                K.set(*it, node(1, 1, INF));
                tem.push_back(*it);
                ++it;
            }
            cout << order[tem.back()] + 1 << '\n';
            for(int &c : tem)tofill.erase(c);
        }else {
            --x;
            int k = id[x];
            int cc = K.get(k, n).fi;
            cc = min(cc, n);
            --cc;
            K.set(cc, node(0, 1, cc));
            tofill.erase(cc);
            cout << dist[order[k]] - dist[order[cc]] << '\n';
        }
    }

    return 0;
}

Compilation message (stderr)

In file included from /usr/include/c++/10/cassert:44,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:33,
                 from ballmachine.cpp:1:
ballmachine.cpp: In function 'int main()':
ballmachine.cpp:132:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::set<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  132 |             assert(x <= tofill.size());
      |                    ~~^~~~~~~~~~~~~~~~
ballmachine.cpp:121:8: warning: 'root' may be used uninitialized in this function [-Wmaybe-uninitialized]
  121 |     dfs(root, -1);
      |     ~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...