Cod sursa(job #863360)

Utilizator SpiriFlaviuBerbecariu Flaviu SpiriFlaviu Data 23 ianuarie 2013 19:11:15
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 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);
}

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);
        intreaba[0][i] = t[i];
    }
    for(int i=1;i<=17;i++)
        for(int j=1;j<=n;j++)
            intreaba[i][j] = intreaba[i-1][intreaba[i-1][j]];
    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;
}