Pagini recente » Cod sursa (job #598752) | Cod sursa (job #1703298) | Monitorul de evaluare | Cod sursa (job #1429493) | Cod sursa (job #69220)
Cod sursa(job #69220)
#include <iostream>
#define maxn 250001
#define maxm 300001
FILE *in = fopen("stramosi.in","r"), *out = fopen("stramosi.out","w");
struct graf
{
int nod, ordine;
graf *next;
};
graf *a[maxn] = {NULL};
int n, m;
graf *query[maxn] = {NULL}; // retine intrebarile pt nodul i
int h = 0;
int radacini[maxn]; // retine nodurile care sunt radacini
int raspunsuri[maxm];
int k = 0;
int st[maxn];
void add(int p, int val)
{
graf *q = new graf;
q->next = a[p];
q->nod = val;
a[p] = q;
}
void add2(int p, int val, int ordine)
{
graf *q = new graf;
q->next = query[p];
q->nod = val;
q->ordine = ordine;
query[p] = q;
}
void read()
{
fscanf(in, "%d %d", &n, &m);
int t;
for ( int i = 1; i <= n; ++i )
{
fscanf(in, "%d", &t);
if ( t )
add(t, i);
else
radacini[++h] = i;
}
int q, p;
for ( int i = 1; i <= m; ++i )
{
fscanf(in, "%d %d", &p, &q);
add2(p, q, i);
}
}
void df(int nod)
{
st[++k] = nod;
while ( query[nod] )
{
raspunsuri[query[nod]->ordine] = query[nod]->nod > k ? 0 : st[k - query[nod]->nod];
query[nod] = query[nod]->next;
}
while ( a[nod] )
{
df(a[nod]->nod);
a[nod] = a[nod]->next;
}
--k;
}
int main()
{
read();
for ( int i = 1; i <= h; ++i )
df(radacini[i]);
for ( int i = 1; i <= m; ++i )
fprintf(out, "%d\n", raspunsuri[i]);
return 0;
}