Cod sursa(job #2308505)

Utilizator TheNextGenerationAyy LMAO TheNextGeneration Data 27 decembrie 2018 11:47:52
Problema Stramosi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("stramosi.in");
ofstream out("stramosi.out");
const int N = 250005;
const int L = 20;
int lvl[N],dp[L][N],n,lg[N];
vector<int> v[N], start;

void dfs(int x)
{
    for (auto it: v[x])
    {
        if (!lvl[it])
        {
            lvl[it] = 1+lvl[x];
            dfs(it);
            dp[0][it] = x;
        }
    }
}
void buildDP()
{
    for (int i = 2; i<=n; i++)
        lg[i] = lg[i/2]+1;
    for (int i = 1; (1<<i)<=n; i++)
        for (int j = 1; j<=n; j++)
            dp[i][j] = dp[i-1][dp[i-1][j]];
}
int query(int x, int p)
{
    int dif = lvl[x]-p;
    for (int i = lg[lvl[x]]; i>=0; i--)
        if (lvl[x]-(1<<i)>=dif)
            x = dp[i][x];
    return x;
}
int main()
{
    int m;
    in >> n >> m;
    for (int i = 1; i<=n; i++)
    {
        int x;
        in >> x;
        if (!x)
            start.push_back(i);
        else
            v[x].push_back(i);
    }
    for (auto it: start)
        dfs(it);
    buildDP();
    for (int i = 1; i<=m; i++)
    {
        int x,p;
        in >> x >> p;
        out << query(x,p) << "\n";
    }
}