Cod sursa(job #2511392)

Utilizator cyg_vladioanBirsan Vlad cyg_vladioan Data 18 decembrie 2019 21:42:42
Problema Stramosi Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;
const int NMAX = 250000;
vector <int> G[NMAX + 5];
int lvl[NMAX + 5] , p[NMAX + 5] , t[NMAX + 5] ,  nr , h;
void dfs1(int u , int l)
{
    int j;
    h = max(h , l);
    for(j = 0 ; j < G[u].size() ; j ++)
        dfs1(G[u][j] , l + 1);
}
void dfs2(int u , int l)
{
    int j , v;
    lvl[u] = l;
    if(l < nr)
        p[u] = 0;
    else
    {
        if(l % nr == 0)
            p[u] = t[u];
        else
            p[u] = p[t[u]];
    }
    for(j = 0 ; j < G[u].size() ; j ++)
        dfs2(G[u][j] , l + 1);
}
int findt(int x , int l)
{
    while(lvl[x] != l)
        x = t[x];
    return x;
}
int main()
{
    freopen("stramosi.in" , "r" , stdin);
    freopen("stramosi.out" , "w" , stdout);
    int n , q , i , x , y , ly , tx , j;
    scanf("%d%d" , &n , &q);
    for(i = 1 ; i <= n ; i ++)
    {
        scanf("%d" , &t[i]);
        G[t[i]].push_back(i);
    }
    dfs1(0 , 0);
    nr = (int)sqrt((double)h);
    dfs2(0 , 0);
    /*for(i = 0 ; i <= n ; i ++)
        printf("%d %d %d\n" , t[i] , p[i] , lvl[i]);
    for(i = 0 ; i <= n ; i ++)
    {
        printf("%d: " , i);
        for(j = 0 ; j < G[i].size() ; j ++)
            printf("%d " , G[i][j]);
        printf("\n");
    }
    printf("%d\n" , nr);*/
    for(i = 1 ; i <= q ; i ++)
    {
        scanf("%d%d" , &x , &y);
        ly = lvl[x] - y;
        if(ly < 0)
            printf("0\n");
        else
        {
            while(lvl[x] / nr != ly / nr)
                x = p[x];
            tx = findt(x , ly);
            printf("%d\n" , tx);
        }
    }
    return 0;
}