1 solutions

  • 0
    @ 2025-11-27 11:59:56

    C++ :

    #include<bits/stdc++.h>
    #define int long long
    #define double long double
    #define bug cout<<"___sgge888___"<<'\n';
    using namespace std;
    int n,m;
    int f[100005][20];
    int s[100005][20];
    vector<int>g[100005];
    int dep[100005];
    void dfs(int u,int fa){
        dep[u]=dep[fa]+1;
        f[u][0]=fa;
        if(!g[u].empty()){
            s[u][0]=g[u][0];
        }
        else{
            s[u][0]=u;
        }
        for(auto v:g[u]){
            dfs(v,u);
        }
    }
    void init(){
        for(int j=1;j<20;j++){
            for(int i=1;i<=n;i++){
                if(f[i][j-1]!=0){
                    f[i][j]=f[f[i][j-1]][j-1];
                }
            }
        }
        for(int j=1;j<20;j++){
            for(int i=1;i<=n;i++){
                s[i][j]=s[s[i][j-1]][j-1];
            }
        }
    }
    int up(int u,int k){
        if(u==1){
            return 1;
        }
        int dis=dep[u]-1;
        if(k>=dis){
            return 1;
        }
        for(int i=0;i<20;i++){
            if((k>>i)&1){
                u=f[u][i];
            }
        }
        return u;
    }
    int down(int u,int k){
        for(int i=0;i<20;i++){
            if((k>>i)&1){
                u=s[u][i];
            }
        }
        return u;
    }
    signed main(){
        ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
        cin>>n>>m;
        for(int i=1;i<=n;i++){
            for(int j=0;j<20;j++){
                s[i][j]=i;
            }
        }
        f[1][0]=0;
        for(int i=2;i<=n;i++){
            int p;
            cin>>p;
            f[i][0]=p;
            g[p].push_back(i);
        }
        for(int i=1;i<=n;i++){
            sort(g[i].begin(),g[i].end());
        }
        dfs(1,0);
        init();
        for(int i=1;i<=m;i++){
            int u,k;
            cin>>u>>k;
            int ans=u;
            for(int j=1;j<=k;j++){
                int x;
                cin>>x;
                if(x>0){
                    ans=up(ans,x);
                }
                else{
                    x=-x;
                    ans=down(ans,x);
                }
            }
            cout<<ans<<'\n';
        }
        return 0;
    }
    
    
    • 1

    Information

    ID
    140
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By