Cod sursa(job #3247278)

Utilizator maryyMaria Ciutea maryy Data 6 octombrie 2024 18:49:49
Problema Stramosi Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("stramosi.in");
ofstream out("stramosi.out");
const int maxp2=20, nmax=250005;
int v[nmax], 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>n) 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>>v[i];
        stramos[0][i]=v[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;
}