Cod sursa(job #863272)

Utilizator SpiriFlaviuBerbecariu Flaviu SpiriFlaviu Data 23 ianuarie 2013 17:48:23
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 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[22][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);
}

int nivel;
void dfs(int nod)
{
    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++)
    {
        nivel++;
        dfs(v[nod][i]);
        nivel--;

    }
}

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])
        {
            nivel = 0;
            dfs(i);
        }
    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;
}