제출 #643414

#제출 시각아이디문제언어결과실행 시간메모리
643414GaLzBall Machine (BOI13_ballmachine)C++14
100 / 100
136 ms24452 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<ll> vll;
const ll mod=1e9+7;
const ll maxn=1e5+5;
const ll INF=1e18;
#define ok ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define fi first
#define se second
#define pb push_back
#define ub upper_bound
#define lb lower_bound
#define endl '\n'
int n, q, t, x, mn[maxn], par[maxn], root, dis[maxn], hrs, cnt, ans, nmr[maxn], lca[maxn][17];
vi adj[maxn], arr;
bool use[maxn];
bool sub1=1;
priority_queue<pii, vector<pii>, greater<>> pq;
bool cmp(int a, int b) {
    return mn[a]<mn[b];
}
void dfs(int now, int fr) {
    mn[now]=now;
    lca[now][0]=fr;
    for(int i=1; i<17; i++) {
        lca[now][i]=lca[lca[now][i-1]][i-1];
    }
    for(auto it : adj[now]) {
        dis[it]=dis[now]+1;
        dfs(it, now);
        mn[now]=min(mn[now], mn[it]);
    }
}
void dfs2(int now) {
    if(!adj[now].empty()) {
        sort(adj[now].begin(), adj[now].end(), cmp);
        for(auto it : adj[now]) {
            dfs2(it);
        }
    }
    arr.pb(now);
}
int main() {
    // Bismillah AC
    ok
    cin >> n >> q;
    for(int i=1; i<=n; i++) {
        cin >> par[i];
        if(par[i]==0){
            root=i;
        } else adj[par[i]].pb(i);
    }
    dfs(root, 0);
    for(int i=1; i<=n; i++) {
        if(!(adj[i].size()==2 || adj[i].empty())) sub1=0;
        if(adj[i].empty() && hrs && dis[i]!=hrs) sub1=0;
        if(adj[i].empty() && !hrs) hrs=dis[i];
    }
    dfs2(root);
    for(auto it : arr) {
        cnt++;
        nmr[it]=cnt;
        pq.push({cnt, it});
    }
    while(q--) {
        cin >> t >> x;
        if(t==1) {
            while(x--) {
                ans=pq.top().se;
                use[pq.top().se]=1;
                pq.pop();
            }
            cout << ans << endl;
        } else {
            ans=0;
            while(use[par[x]]) {
                for(int i=16; i>=0; i--) {
                    if(use[lca[x][i]]) {
                        ans+=dis[x]-dis[lca[x][i]];
                        x=lca[x][i];
                        break;
                    }
                }
            }
            use[x]=0;
            pq.push({nmr[x], x});
            cout << ans << endl;
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...