Cod sursa(job #1481406)
Utilizator | Data | 4 septembrie 2015 13:32:45 | |
---|---|---|---|
Problema | Stramosi | Scor | 0 |
Compilator | c | Status | done |
Runda | Arhiva de probleme | Marime | 2.79 kb |
#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 scrie();
void addNod(nod *&, long);
int main()
{
read();
solve();
scrie();
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)
{
addNod(L[j], i);
d[i] = '1';
}
}
for(i=1; i<=M; ++i)
{
scanf("%ld %ld", q+i, p+i);
addNod(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 scrie()
{
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 addNod(nod *&L, long nd)
{
nod *x = new nod;
x->nd = nd;
x->next = L;
L = x;
}