Cod sursa(job #3247281)

Utilizator maryyMaria Ciutea maryy Data 6 octombrie 2024 18:56:48
Problema Stramosi Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.03 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;
}