Pagini recente » Cod sursa (job #300224) | Cod sursa (job #998795) | Cod sursa (job #2505262)
#include <fstream>
#include <vector>
using namespace std;
ifstream fi("stramosi.in");
ofstream fo("stramosi.out");
int N,Q;
vector <int> D[250001];
int P[250001];
int LEVEL[250001];
int table[250001][20];
void df(int vf, int level)
{
LEVEL[vf]=level;
vector <int> :: iterator it;
for(it = D[vf].begin();it != D[vf].end();it++)
{
df(*it, level+1);
}
}
int walk(int vf, int dist)
{///returneaza stramosul lui vf situat la departare dist, 0 daca nu exista
if(LEVEL[vf]<=dist)
return 0;
for(int p=18;p>=0;p--){
if((1<<p)<=dist){
vf = table[vf][p];
dist -= (1<<p);
}
}
return vf;
}
int main()
{
fi>>N>>Q;
for(int i=1;i<=N;i++)
{
fi>>P[i];
D[P[i]].push_back(i);
}
/// se determina adancimea pentru fiecare vf
for(int i=1;i<=N;i++)
{
if(P[i]==0)
df(i,1);
}
///se construieste matricea table
///table[v][d] = stramosul lui v situat la departare 2^d
for(int i=1;i<=N;i++)
{
table[i][0]=P[i];
}
for(int c=1;c<=18;c++)
for(int 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(int q=1;q<=Q;q++)
{
int v,d;
fi>>v>>d;
fo<<walk(v,d)<<'\n';
}
fi.close();
fo.close();
return 0;
}