Cod sursa(job #2520040)

Utilizator alexdumitrescuDumitrescu George Alex alexdumitrescu Data 8 ianuarie 2020 20:06:53
Problema Stramosi Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <bits/stdc++.h>
#define Nmax 250005

using namespace std;
ifstream fin ("stramosi.in");
ofstream fout ("stramosi.out");
int h[Nmax], t[20][Nmax], n, q, x, y;
vector <int> v[Nmax];
void dfs(int x)
{
    for(int k=1; (1<<k) < h[x]; k++)
        t[k][x]=t[k-1][t[k-1][x]];

    for(int i=0;i<v[x].size();i++)
        if(h[v[x][i]]==0)
        {
            h[v[x][i]]=h[x]+1;
            dfs(v[x][i]);
        }
}
int ras(int x, int y)
{
    if(y>=h[x])
        return 0;
    if(y==0)
        return x;
    int k;
    for(k=0;(1<<(k+1))<=y;k++);
    return ras(t[k][x], y-(1<<k));
}
int main()
{
    fin >> n >> q;
    for(int i=1;i<=n;i++)
        {
            fin >> t[0][i];
            v[t[0][i]].push_back(i);
        }
    for(int i=1;i<=n;i++)
        if(t[0][i]==0)
        {
            h[i]=1;
            dfs(i);
        }
    for(int i=1;i<=q;i++)
    {
        fin >> x >> y;
        fout << ras(x, y) << '\n';
    }
    return 0;
}