Cod sursa(job #863065)

Utilizator SpiriFlaviuBerbecariu Flaviu SpiriFlaviu Data 23 ianuarie 2013 11:47:39
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("stramosi.in");
ofstream fout("stramosi.out");

vector<int> v[250001];
int n,m,x,y,arbdfs[250001],t[250001],intreaba[20][250001],nv[250001];

void query(int nod, int dist)
{
    if(dist == 0)
    {
        fout<<nod<<'\n';
        return;
    }
    int log = 0;
    int i=1;
    while(i*2<=dist)
    {
        i*=2;
        log++;
    }
    query(intreaba[log][nod],dist-i);

}

void dfs(int nod, int nivel)
{
    arbdfs[nivel] = nod;
    nv[nod] = nivel;
    int log = 0;
    int i = 1;
    while(i<=nivel)
    {
        intreaba[log][nod] = arbdfs[nivel - i];
        i*=2;
        log++;
    }
    for(unsigned int i=0;i<v[nod].size();i++)
    {
        dfs(v[nod][i],nivel+1);
    }
}


int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        fin>>t[i];
        v[t[i]].push_back(i);
    }

    for(int i=1;i<=n;i++)
        if(!t[i])
            dfs(i,0);

    for(int i=1;i<=m;i++)
    {
        fin>>y>>x;

        if(x>nv[y])
            fout<<"0"<<'\n';
        else
            query(y,x);
    }



    fin.close();
    fout.close();
    return 0;
}