Cod sursa(job #2149583)

Utilizator DavidLDavid Lauran DavidL Data 2 martie 2018 19:12:41
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <fstream>
#define MAXN 250005
#define LOGN 25
using namespace std;
ifstream fi("stramosi.in");
ofstream fo("stramosi.out");

int n,m;
int P[MAXN]; /// parintele nodului
int stramos[LOGN][MAXN]; /// stramosul nodului j aflat la 1<<i distanta
//vector <int> G[MAXN];

void precalc()
{
    for (int i=1; i<=n; i++)
        stramos[0][i]=P[i];

    for (int dec=1; (1<<dec)<=n; dec++)
    {
        for (int i=1; i<=n; i++)
        {
            stramos[dec][i]=stramos[dec-1][stramos[dec-1][i]];
        }
    }
}

void afisarePrecalc()
{
    for (int i=1; i<=n; i++)
    {
        for (int dec=0; (1<<dec)<=n; dec++)
        {
            fo<<"nodul "<<i<<" la "<<(1<<dec)<<": "<<stramos[dec][i]<<"\n";
        }
    }
}

int query(int nod,int dep)
{
    int curent=nod; /// nodul curent
    for (int bit=0; (1<<bit)<=dep; bit++)
        if (dep&(1<<bit))
        {
            nod=stramos[bit][nod];
        }
    return nod;
}

int main()
{
    fi>>n>>m;
    for (int i=1; i<=n; i++)
    {
        fi>>P[i];
        //G[P[i]].push_back(i);
    }

    precalc();
    //afisarePrecalc();

    while (m--)
    {
        int p,q;
        fi>>q>>p;
        int rez=query(q,p);
        fo<<rez<<"\n";
    }

    return 0;
}