제출 #1352435

#제출 시각아이디문제언어결과실행 시간메모리
1352435hyyhBall Machine (BOI13_ballmachine)C++20
100 / 100
155 ms31964 KiB
#include <iostream>
#include <math.h>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <iomanip>
#include <set>
#include <bitset>
#include <tuple>
#include <functional>

using namespace std;
using ll = long long;
using pii = pair<int,int>;
using piii = tuple<int,int,int>;
using piiii = tuple<int,int,int,int>;
#define endl '\n'
#define f first
#define s second
#define all(x) begin(x),end(x)

int const N = 2e5+10;
int const LN = 18;
int const INF = 1e9+10;

int fenwick[N];
int si;

void update(int n,int val){
    for(;n <= si;n += n&-n) fenwick[n] += val;
}

int query(int n){
    int sum = 0;
    for(;n > 0;n -= n&-n) sum += fenwick[n];
    return sum;
}

vector<int> adj[N];

vector<pii> order[N];

int lca[N][LN];
int depth[N];
int rtime[N];
int posttime[N];
int minval[N];
bool curval[N];

int t = 1;

void dfs1(int n){
    minval[n] = n;
    for(auto k:adj[n]){
        depth[k] = depth[n]+1;
        dfs1(k);
        minval[n] = min(minval[k],minval[n]);
        order[n].emplace_back(minval[k],k);
    }
    sort(all(order[n]));
}

void dfs2(int n){
    for(auto [w,k]:order[n]){
        dfs2(k);
    }
    posttime[n] = t++;
    rtime[posttime[n]] = n;
}

int findfirst(){
    int l = 1;
    int r = si;
    int ans = r;
    while(l <= r){
        int md = l+(r-l)/2;
        if(query(md) < md) ans = min(ans,md),r = md-1;
        else l = md+1;   
    }
    return ans;
}

int main(){
    int n;cin >> n;
    si = n;
    int q;cin >> q;
    int root;
    for(int i{1};i <= n;i++){
        cin >> lca[i][0];
        if(lca[i][0] == 0) root = i,lca[i][0] = i;
        else adj[lca[i][0]].emplace_back(i);
    }
    for(int i{1};i < LN;i++){
        for(int j{1};j <= n;j++){
            lca[j][i] = lca[lca[j][i-1]][i-1];
        }
    }
    dfs1(root);
    dfs2(root);
    for(int i{};i < q;i++){
        int t,b;cin >> t >> b;
        if(t == 1){
            int last;
            for(int i{};i < b;i++){
                int pos = findfirst();
                last = rtime[pos];
                curval[last] = 1;
                update(pos,1);
            }
            cout << last << endl;
        }
        else if(t == 2){
            int cur = b;
            for(int i{LN-1};i >= 0;i--){
                //cout << cur << " " << curval[cur] << endl;
                if(curval[lca[cur][i]]) cur = lca[cur][i];
            }
            //cout << cur << "-" << endl;
            curval[cur] = 0;
            update(posttime[cur],-1);
            cout << depth[b]-depth[cur] << 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...