Cod sursa(job #2966343)

Utilizator alexandru.morusAlexandru Morus alexandru.morus Data 17 ianuarie 2023 09:12:56
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.19 kb
///Alexandru Morus
#include <bits/stdc++.h>

using namespace std;

ifstream in("stramosi.in");
ofstream out("stramosi.out");
int mt[250003][19],niv[250003];
int nivel (int x)
{
    if(niv[x] >0)
    {
        return niv[x];
    }
    if(mt[x][0] == 0)
    {
        return 0;
    }
    niv[x] = 1 + nivel(mt[x][0]);
    return niv[x];
}
int main ()
{
    int i,n,x,m,j,a,b;
    in >> n >> m;
    for(i = 1; i <= n; i ++)
    {
        in >> x;
        mt[i][0] = x;
    }
    for(i = 1; (1 << i) < n;i ++)
    {
        for(j = 1; j <= n; j ++)
        {
            mt[j][i] = mt[mt[j][i - 1]][i - 1];
        }
    }
    for(i = 1; i <= n; i ++)
    {
        nivel(i);
        //out << niv[i] << '\n';
    }
    for(i = 1; i <= m; i ++)
    {
        in >> a >> b;
        b = niv[a] - b;
        if(b < 0)
        {
            out << 0 << '\n';
        }
        else
        {
            for(j = 18; j >= 0; j --)
            {
                int salt = 1 << j;
                if(niv[a] - salt >= b)
                {
                    a = mt[a][j];
                }
            }
            out << a << '\n';
        }

    }
    return 0;
}