Cod sursa(job #3247491)

Utilizator Giulian617Buzatu Giulian Giulian617 Data 7 octombrie 2024 23:47:36
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("stramosi.in");
ofstream out("stramosi.out");
const int maxp2 = 19, nmax = 250005;
int stramos[maxp2][nmax]; // stramos[i][j] -> stramosul 2^i al nodului j
int n, m;
void PrecalculateAncestors()
{
    for (int i = 1; i < maxp2; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            stramos[i][j] = stramos[i - 1][stramos[i - 1][j]]; // impart intervalul in 2^(i-1) de 2 ori
        }
    }
}
int FindAncestor(int node, int kth)
{
    if (kth >= (1 << maxp2))
        return 0;
    for (int i = 0; i < maxp2; i++)
    {
        if (kth & (1 << i)) // numarul stramosului se imparte la 2^i -> mut nodul 2^i pozitii mai sus
        {
            node = stramos[i][node];
        }
    }
    return node;
}
int main()
{
    int q, p;
    in >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        in >> stramos[0][i];
    }
    PrecalculateAncestors();
    for (int i = 1; i <= m; i++)
    {
        in >> q >> p; // al p-lea stramos al nodului q
        out << FindAncestor(q, p) << '\n';
    }
    return 0;
}