Pagini recente » Cod sursa (job #3277849) | Cod sursa (job #1207156) | Cod sursa (job #907250) | Cod sursa (job #865888) | Cod sursa (job #27833)
Cod sursa(job #27833)
#include <stdio.h>
#define DIM 250000
#define DIM2 300000
#define in "stramosi.in"
#define out "stramosi.out"
typedef struct nod {
int vf;
nod* next;
} NOD, *PNOD;
PNOD L[DIM];
int str[DIM], d[DIM], sel[DIM];
int p1[DIM2], p2[DIM2], apar[DIM];
int n, t = -1, v, m;
void Read();
void Add(int i, int j);
void DFS(int nod);
void Write();
int main()
{
Read();
DFS(0);
Write();
return 0;
}
void Read()
{
freopen(in,"r",stdin);
int j;
scanf("%d %d", &n, &m );
for ( int i = 1; i <= n; i++ )
{
scanf("%d", &j );
Add(i,j);
Add(j,i);
}
}
void Add(int i, int j)
{
PNOD q = new NOD;
q->vf = i;
q->next = L[j];
L[j] = q;
}
void DFS(int nod)
{
++v;
t++;
sel[nod] = 1;
d[v] = t;
str[v] = nod;
apar[nod] = v;
for ( PNOD q = L[nod]; q; q = q->next )
{
if ( !sel[q->vf])
{
DFS(q->vf);
}
}
t = t - 1;
}
void Write()
{
freopen(out,"w",stdout);
int sursa,x, di, dist, ok = 0, j, pas;
for ( int i = 1; i <= m; i++ )
{
scanf("%d %d", &p1[i], &p2[i]);
ok = 0;
di = 0;
sursa = p1[i];
x = p2[i];
dist = d[apar[sursa]];
j = apar[sursa];
pas = 0;
if ( dist - x > 0 )
{
while ( ok == 0 )
{
if ( dist > d[j] )
{
dist = d[j];
di += 1;
pas = 1;
}
else
{
if ( dist == d[j] ) pas = 1;
else pas = d[j]-dist;
}
if ( di == x ) ok = 1;
if ( j == 1 ) ok = 1;
j-=pas;
}
printf("%d\n",str[j+1]);
}
else printf("0\n");
}
}