Cod sursa(job #2520042)

Utilizator alexdumitrescuDumitrescu George Alex alexdumitrescu Data 8 ianuarie 2020 20:16:19
Problema Stramosi Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.11 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, lg[Nmax];
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==0)
        return x;
    return ras(t[lg[y]][x], y-(1<<lg[y]));
}
int main()
{
    fin >> n >> q;
    int u=0;
    for(int i=1;i<=n;i++)
        {
            fin >> t[0][i];
            v[t[0][i]].push_back(i);
            lg[i]=lg[i-1];
            if(u*2==i)
            {
                lg[i]++;
                u=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;
        if(y>=h[x])
            fout << "0\n";
        else fout << ras(x, y) << '\n';
    }
    return 0;
}