Cod sursa(job #2505278)

Utilizator TudorCristeaCristea Tudor TudorCristea Data 6 decembrie 2019 17:37:15
Problema Stramosi Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <iomanip>
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");

int N,Q;

vector <int> D[250005];
vector <int> :: iterator it;

int P[250005];
int LEVEL[250005];
int TABLE[250005][20];

void df (int varf,int level)
{
    vector <int> :: iterator it;
    LEVEL[varf]=level;
    for (it=D[varf].begin();it!=D[varf].end();++it)
    {
        df(*it,level+1);
    }
}

int walk (int varf,int dist)
{
    ///returneaza stramosul lui varf situat la departare dist (sau 0 daca nu exista)
    if (LEVEL[varf]<=dist)
    {
        return 0;
    }
    int p;
    for (p=18;p>=0;--p)
    {
        if((1<<p)<=dist)
        {
            varf=TABLE[varf][p];
            dist=dist-(1<<p);
        }
    }
    return varf;
}

int main()
{
    fin >> N >> Q;
    int i,j,c,v;
    for (i=1;i<=N;++i)
    {
        int parinte;
        fin >> parinte;
        P[i]=parinte;
        D[parinte].push_back(i);
    }
    /*
    for (i=1;i<=N;++i)
    {
        fout << setw(3) << i << ":" << P[i] << ":";
        for (it=D[i].begin();it!=D[i].end();++it)
        {
            fout << (*it) << " ";
        }
        fout << '\n';
    }
    */
    ///se deteremina nivelul (adancimea) pentru fiecare varf
    for (i=1;i<=N;++i)
    {
        if (P[i]==0)
        {
            df(i,1);
        }
    }
    /*
    for (i=1;i<=N;++i)
    {
        fout << i << " " << LEVEL[i] << '\n';
    }
    */
    ///se construieste matricea TABLE
    ///TABLE[v][d]=stramosul lui v situat la departare 2^d
    for (i=1;i<=N;++i)
    {
        TABLE[i][0]=P[i];
    }
    for (c=1;c<=18;++c)
    {
        for (v=1;v<=N;++v)
        {
            if ((1<<c)>=LEVEL[v])
            {
                TABLE[v][c]=0;
            }
            else
            {
                TABLE[v][c]=TABLE[TABLE[v][c-1]][c-1];
            }
        }
    }
    /*
    for (i=1;i<=N;++i)
    {
        fout << setw(3) << i << ":";
        for (j=0;j<=18;++j)
        {
            fout << setw(3) << TABLE[i][j];
        }
        fout << '\n';
    }
    */
    for (i=1;i<=Q;++i)
    {
        int v,d;
        fin >> v >> d;
        fout << walk(v,d) << '\n';
    }
    fin.close();
    fout.close();
    return 0;
}