14225 Seafu

                Never    
C
       
#include<stdio.h>
#include<stdlib.h>

int direct[1001];
int distance[1001];
int child[1001];
int n;

typedef struct Node {
    int id;
    struct Node *childnode[1000];
} Node;
Node *create_node(int id){
    Node *newnode = (Node*)malloc(sizeof(Node));
    newnode->id = id;
    for(int i=0;i<child[id];i++){
        newnode->childnode[i] = NULL;
    }
    return newnode;
}
Node *buildtree(int n,int *direct){
    int nodenum[n+1];
    for(int i=1;i<=n;i++){
        nodenum[i] = 0;
    }
    Node *root = create_node(1);
    Node *nodes[n+1];
    nodes[1] = root;
    for(int i=2;i<=n;i++){

        Node *parent = nodes[direct[i-2]];
        Node *node = create_node(i);
        parent->childnode[nodenum[parent->id]++] = node;
        nodes[i] = node;
    }
    return root;
}
void calculate(Node *root,int level,int *distance){
    if(root == NULL) return;
    distance[(root->id)-1] = level;
    for(int i=0;i<child[root->id];i++){
        calculate(root->childnode[i],level+1,distance);
    }
}
int find(int *direct,int student,int level){
    if(level == 0) return direct[student-2];
    if(level > 0 && student ==2) return -1;
    find(direct,direct[student-2],level-1);
}
void freeTree(Node *root){
    if(root == NULL) return;
    for(int i=0;i<child[root->id];i++) freeTree(root->childnode[i]);
    //printf("%d ",root->id);
    free(root);
}
int main(void){

    scanf("%d",&n);
    for(int i=0;i<n;i++){
        child[i] = 0;
    }
    for(int i=0;i<n-1;i++){
        scanf("%d",&direct[i]);
        child[direct[i]]++;
    }
    Node *root = buildtree(n,direct);


    calculate(root,0,distance);
    for(int i=1;i<n-1;i++) printf("%d ",distance[i]);
    printf("%d",distance[n-1]);
    printf("\n");
    int q;
    scanf("%d",&q);
    for(int i=0;i<q;i++){
        int A,B;
        scanf("%d %d",&A,&B);
        if(B == 0) printf("-1\n");
        else{
            printf("%d\n",find(direct,A,B-1));
        }
    }
    freeTree(root);

    return 0;
}

Raw Text