Cod sursa(job #2908331)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 2 iunie 2022 21:35:00
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <fstream>

using namespace std;

ifstream in ("stramosi.in");
ofstream out ("stramosi.out");

const int max_size = 25e4 + 1, rmax = 18;

int t[rmax][max_size], nivel[max_size], lg[max_size], n;

void lvl (int x)
{
    if (nivel[x] != 0)
    {
        return;
    }
    lvl(t[0][x]);
    nivel[x] = 1 + nivel[t[0][x]];
}

int anc (int x, int ord)
{
    int e = 0;
    while (ord > 0)
    {
        if (ord % 2 == 1)
        {
            x = t[e][x];
        }
        e++;
        ord /= 2;
    }
    return x;
}

int main ()
{
    int q;
    in >> n >> q;
    for (int i = 1; i <= n; i++)
    {
        in >> t[0][i];
        if (t[0][i] == 0)
        {
            nivel[i] = 1;
        }
    }
    for (int e = 1; e < rmax; e++)
    {
        for (int i = 1; i <= n; i++)
        {
            t[e][i] = t[e - 1][t[e - 1][i]];
        }
    }
    for (int i = 2; i <= n; i++)
    {
        lg[i] = 1 + lg[i / 2];
    }
    for (int i = 1; i <= n; i++)
    {
        lvl(i);
    }
    while (q--)
    {
        int x, d;
        in >> x >> d;
        out << anc(x, d) << '\n';
    }
    in.close();
    out.close();
    return 0;
}