Cod sursa(job #963267)

Utilizator poptibiPop Tiberiu poptibi Data 16 iunie 2013 23:29:34
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;

#define Nmax 550010

int N, M, X, Y, Rad, Stack[2 * Nmax], Father[Nmax], Level[Nmax], SqrtAncestor[Nmax];
vector<int> G[Nmax];


void DFS(int Node, int Pos, int L)
{
    Level[Node] = L;
    if(Pos - Rad > 0) SqrtAncestor[Node] = Stack[Pos - Rad];
    Stack[Pos] = Node;

    for(int i = 0; i < G[Node].size(); ++ i)
        if(!Level[ G[Node][i] ])
            DFS(G[Node][i], Pos + 1, L + 1);
}

int main()
{
    freopen("stramosi.in", "r", stdin);
    freopen("stramosi.out", "w", stdout);

    scanf("%i %i", &N, &M);

    Rad = int(sqrt(N));

    for(int i = 1; i <= N; ++ i)
    {
        scanf("%i", &Father[i]);
        if(Father[i] != 0)
        {
            G[Father[i]].push_back(i);
            G[i].push_back(Father[i]);
        }
    }

    for(int i = 1; i <= N; ++ i)
        if(!Level[i])
            DFS(i, 1, 1);

    for(int i = 1; i <= M; ++ i)
    {
        int Node, P, UpLevel;
        scanf("%i %i", &Node, &P);
        UpLevel = Level[Node] - P;

        if(UpLevel <= 0)
        {
            printf("0\n");
            continue;
        }

        while(Level[ SqrtAncestor[Node] ] >= UpLevel)
            Node = SqrtAncestor[Node];

        while(Level[Node] > 0 && Level[Node] != UpLevel)
            Node = Father[Node];

        printf("%i\n", Node);
    }
    return 0;
}