Pagini recente » Cod sursa (job #2626936) | Cod sursa (job #2328961) | Cod sursa (job #2508771) | Cod sursa (job #2506805) | Cod sursa (job #2505278)
#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;
}