Pagini recente » Cod sursa (job #3339301) | Cod sursa (job #3352962) | Cod sursa (job #1722796) | Cod sursa (job #1021353) | Cod sursa (job #3345087)
#include <fstream>
#include <vector>
#define NMAX 250002
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
int N,M,rad,tata[NMAX],up[NMAX][1<<14];
vector<int> tree[NMAX];
void citire()
{
fin>>N>>M;
for(int i=1; i<=N; i++)
{
fin>>tata[i];
if(!tata[i])
{
rad=i;
}
tree[tata[i]].push_back(i);
}
}
void DFS(int nod)
{
for(int i=0; i<tree[nod].size(); i++)
{
int next_nod=tree[nod][i];
up[next_nod][0]=nod;
for(int j=1; j<14; j++)
{
up[next_nod][j]=up[up[next_nod][j-1]][j-1];
}
DFS(next_nod);
}
}
int Binary_lift(int nod, int k)
{
for(int i=13; i>=0; i--)
{
if(k&(1<<i))
{
nod=up[nod][i];
if(!nod)
{
return 0;
}
}
}
return nod;
}
int main()
{
rad=0;
citire();
DFS(rad);
int Q,P;
for(int i=1; i<=M; i++)
{
fin>>Q>>P;
fout<< Binary_lift(Q,P) << "\n";
}
return 0;
}