Pagini recente » Cod sursa (job #2302625) | Cod sursa (job #2934784) | Cod sursa (job #2367542) | Cod sursa (job #430421) | Cod sursa (job #42144)
Cod sursa(job #42144)
#include <stdio.h>
#define dim 250001
#define Dim 300001
long N, M;
long lv[dim], q[Dim], p[Dim];
char d[dim], Uz[dim];
struct nod
{ long nd; nod *next; } *L[dim], *X[dim];
struct list
{ long ac, c; list *next; } *Sol[dim];
void Read();
void Df(long, long);
void Solve();
void Write();
void Add(nod *&, long);
int main()
{
Read();
Solve();
Write();
return 0;
}
void Read()
{
freopen("stramosi.in", "r", stdin);
scanf("%ld %ld", &N, &M);
long i, j;
for(i=1; i<=N; ++i)
{
scanf("%ld", &j);
if(j)
{
Add(L[j], i);
d[i] = '1';
}
}
for(i=1; i<=M; ++i)
{
scanf("%ld %ld", q+i, p+i);
Add(X[q[i]], p[i]);
}
fclose(stdin);
}
void Df(long nd, long niv)
{
Uz[nd] = '1';
lv[niv] = nd;
nod *x = L[nd];
nod *y;
while(x)
{
if(Uz[x->nd] != '1')
{
y = X[x->nd];
while(y)
{
if(niv-y->nd+1 >= 1)
{
long ret = lv[niv-y->nd+1];
list *p = new list;
p->ac = y->nd;
p->c = ret;
p->next = Sol[x->nd];
Sol[x->nd] = p;
}
y = y->next;
}
Df(x->nd, niv+1);
}
x = x->next;
}
}
void Solve()
{
long i;
for(i=1; i<=N; ++i)
if(d[i] != '1')
Df(i, 1);
}
void Write()
{
freopen("stramosi.out", "w", stdout);
long i;
int ok;
for(i=1; i<=M; ++i)
{
list *x = Sol[q[i]];
ok = 0;
while(x)
{
if(x->ac == p[i])
{
printf("%ld\n", x->c);
ok = 1;
break;
}
x = x->next;
}
if(!ok)
printf("0\n");
}
fclose(stdout);
}
void Add(nod *&L, long nd)
{
nod *x = new nod;
x->nd = nd;
x->next = L;
L = x;
}