제출 #786764

#제출 시각아이디문제언어결과실행 시간메모리
786764trucmaiBall Machine (BOI13_ballmachine)C++17
0 / 100
225 ms23784 KiB
    #include <iostream>
    #include <vector>
    #include <tuple>
    #include <queue>
    #include <stack>
    #include <deque>
    #include <set>
    #include <map>
    #include <cmath>
    #include <random>
    #include <string>
    #include <bitset>
    #include <cassert>
    #include <climits>
    #include <algorithm>
    #include <unordered_set>
    #include <unordered_map>
    using namespace std;
     
    #define ll long long
    #define f first
    #define s second
     
    void __print(int x) { cerr << x; }
    void __print(long x) { cerr << x; }
    void __print(long long x) { cerr << x; }
    void __print(unsigned x) { cerr << x; }
    void __print(unsigned long x) { cerr << x; }
    void __print(unsigned long long x) { cerr << x; }
    void __print(float x) { cerr << x; }
    void __print(double x) { cerr << x; }
    void __print(long double x) { cerr << x; }
    void __print(char x) { cerr << '\'' << x << '\''; }
    void __print(const char *x) { cerr << '\"' << x << '\"'; }
    void __print(const string &x) { cerr << '\"' << x << '\"'; }
    void __print(bool x) { cerr << (x ? "true" : "false"); }
     
    template<typename A> void __print(const A &x);
    template<typename A, typename B> void __print(const pair<A, B> &p);
    template<typename... A> void __print(const tuple<A...> &t);
    template<typename T> void __print(stack<T> s);
    template<typename T> void __print(queue<T> q);
    template<typename T, typename... U> void __print(priority_queue<T, U...> q);
     
    template<typename A> void __print(const A &x) {
        bool first = true;
        cerr << '{';
        for (const auto &i : x) {
            cerr << (first ? "" : ","), __print(i);
            first = false;
        }
        cerr << '}';
    }
     
    template<typename A, typename B> void __print(const pair<A, B> &p) {
        cerr << '(';
        __print(p.f);
        cerr << ',';
        __print(p.s);
        cerr << ')';
    }
     
    template<typename... A> void __print(const tuple<A...> &t) {
        bool first = true;
        cerr << '(';
        apply([&first] (const auto &...args) { ((cerr << (first ? "" : ","), __print(args), first = false), ...); }, t);
        cerr << ')';
    }
     
    template<typename T> void __print(stack<T> s) {
        vector<T> debugVector;
        while (!s.empty()) {
            T t = s.top();
            debugVector.push_back(t);
            s.pop();
        }
        reverse(debugVector.begin(), debugVector.end());
        __print(debugVector);
    }
     
    template<typename T> void __print(queue<T> q) {
        vector<T> debugVector;
        while (!q.empty()) {
            T t = q.front();
            debugVector.push_back(t);
            q.pop();
        }
        __print(debugVector);
    }
     
    template<typename T, typename... U> void __print(priority_queue<T, U...> q) {
        vector<T> debugVector;
        while (!q.empty()) {
            T t = q.top();
            debugVector.push_back(t);
            q.pop();
        }
        __print(debugVector);
    }
     
    void _print() { cerr << "]\n"; }
     
    template <typename Head, typename... Tail> void _print(const Head &H, const Tail &...T) {
        __print(H);
        if (sizeof...(T)) cerr << ", ";
        _print(T...);
    }
     
    #ifdef DEBUG
    	#define D(...) cerr << "Line: " << __LINE__ << " [" << #__VA_ARGS__ << "] = ["; _print(__VA_ARGS__)
    #else
        #define D(...)
    #endif
     
    int n, q, par[100005][20], mn[100005], out[100005], idx, op, v, nd, ans, depth[100005];
    vector<int> adj[100005];
    bool filled[100005];
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
     
    void dfs1(int curr) {
        mn[curr] = curr;
        for (int i : adj[curr]) {
            depth[i] = depth[curr] + 1;
            dfs1(i);
            mn[curr] = min(mn[curr], mn[i]);
        }
    }
     
    void dfs2(int curr) {
        for (int i : adj[curr]) {
            dfs2(i);
        }
        out[curr] = ++idx;
    }
     
    int main() {
     
        ios_base::sync_with_stdio(false);
        cin.tie(0);
     
        cin >> n >> q;
        for (int i = 1, x; i <= n; i++) {
            cin >> x;
            par[i][0] = x;
            adj[x].push_back(i);    
        }
     
        dfs1(0);
     
        for (int i = 1; i <= 19; i++) {
            for (int j = 1; j <= n; j++) {
                par[j][i] = par[par[j][i - 1]][i - 1];
            }
        }    
        
        for (int i = 1; i <= n; i++) {
            sort(adj[i].begin(), adj[i].end(), [](int x, int y) {
                return mn[x] < mn[y];
            });
        }
     
        dfs2(0);
        
        for (int i = 1; i <= n; i++) {
            pq.push({out[i], i});
            cout<<i<<" "<<out[i]<<endl;    
        }
         
        while (q--) {
            cin >> op >> v;
            ans = 0;
            if (op == 1) {
                while (v--) {
                    nd = pq.top().s;
                    pq.pop();
                    filled[nd] = true;
                    ans = nd;
                }
                cout << ans << "\n";
            } else {
                nd = v;
                for (int i = 19; i >= 0; i--) {
                    if (filled[par[nd][i]]) {
                        nd = par[nd][i];
                    }
                }
                cout << depth[v] - depth[nd] << "\n";
                filled[nd] = false;
                pq.push({out[nd], nd});
            }
        }
     
    }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...