제출 #1356222

#제출 시각아이디문제언어결과실행 시간메모리
1356222NewtonabcBall Machine (BOI13_ballmachine)C++20
0 / 100
244 ms23420 KiB
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
const int M=1<<18;
vector<int> adj[N];
int s[M],lz[M],ti,dp[N],c[N],d[N][18],rv[N],dep[N];
void build(int l,int r,int idx){
    lz[idx]=-1;
    if(l==r){
        s[idx]=1;
        return;
    }
    int m=(l+r)/2;
    build(l,m,idx*2);
    build(m+1,r,idx*2+1);
    s[idx]=s[idx*2]+s[idx*2+1];
}
void pushlz(int l,int r,int idx){
    if(lz[idx]==-1) return;
    s[idx]=(r-l+1)*lz[idx];
    if(l!=r) lz[idx*2]=lz[idx],lz[idx*2+1]=lz[idx];
    lz[idx]=-1;
}
void update(int l,int r,int idx,int a,int b,int val){
    pushlz(l,r,idx);
    if(a>r || b<l) return;
    if(a<=l && b>=r){
        lz[idx]=val;
        pushlz(l,r,idx);
        return;
    }
    int m=(l+r)/2;
    update(l,m,idx*2,a,b,val);
    update(m+1,r,idx*2+1,a,b,val);
    s[idx]=s[idx*2]+s[idx*2+1];
}
int query(int l,int r,int idx,int a,int b){
    pushlz(l,r,idx);
    if(a>r || b<l) return 0;
    if(a<=l && b>=r) return s[idx];
    int m=(l+r)/2;
    return query(l,m,idx*2,a,b)+query(m+1,r,idx*2+1,a,b);
}
int walk(int l,int r,int idx,int k){
    pushlz(l,r,idx);
    if(l==r) return l;
    int m=(l+r)/2;
    pushlz(l,m,idx*2),pushlz(m+1,r,idx*2+1);
    if(s[idx*2]<k) return walk(m+1,r,idx*2+1,k-s[idx*2]);
    return walk(l,m,idx*2,k);
}
void dfs(int u){
    dp[u]=u;
    for(auto v:adj[u]){
        dep[v]=dep[u]+1;
        dfs(v);
        dp[u]=min(dp[u],dp[v]);
    }
}
void efs(int u){
    for(auto v:adj[u]){
        efs(v);
    }
    c[u]=ti++;
    rv[c[u]]=u;
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n,q; cin>>n >>q;
    int rt;
    for(int i=1;i<=n;i++){
        int x; cin>>x;
        if(x==0) rt=i,d[i][0]=i;
        else{
            adj[x].push_back(i);
            d[i][0]=x;
        }
    }
    for(int i=1;i<18;i++){
        for(int j=1;j<=n;j++){
            d[j][i]=d[d[j][i-1]][i-1];
        }
    }
    dfs(rt);
    for(int i=1;i<=n;i++){
        sort(adj[i].begin(),adj[i].end(),[&](int x,int y){
            return dp[x]<dp[y];
        });
    }
    efs(rt);
    build(0,ti-1,1);
    //for(int i=0;i<ti;i++) cout<<query(0,ti-1,1,i,i) <<"\n";
    while(q--){
        int t,k; cin>>t >>k;
        if(t==1){
            int id=walk(0,ti-1,1,k);
            cout<<rv[id] <<"\n";
        }
        else{
            int now=k;
            for(int i=17;i>=0;i--){
                if(query(0,ti-1,1,c[d[now][i]],c[d[now][i]])==1) now=d[now][i];
            }
            cout<<dep[k]-dep[now] <<"\n";
            update(0,ti-1,1,c[now],c[now],0);
        }
    }
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…