Cod sursa(job #863526)

Utilizator stoicatheoFlirk Navok stoicatheo Data 23 ianuarie 2013 21:32:39
Problema Energii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 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;
}