Pagini recente » Cod sursa (job #2603795) | Borderou de evaluare (job #2068318) | Cod sursa (job #2652923) | Borderou de evaluare (job #1364512) | Cod sursa (job #318452)
Cod sursa(job #318452)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int **a, **stramos, *b, *cul, n, m;
void dfs (int u, int timp) {
timp++;
cul[u] = 1;
int i, j, v;
for (i=1; i <= a[u][0]; ++i) {
v = a[u][i];
if (cul [v] == 0) {
stramos [v][1] = u;
for (j = 2; j <= timp; ++j)
stramos [v][j] = b [stramos [v][j-1]];
dfs (v, timp);
}
}
}
int main() {
int i, j, x, y, t;
FILE *f = fopen ("stramosi.in", "r"), *fout = fopen ("stramosi.out", "w");
fscanf (f, "%d %d", &n, &m);
t = (int)log (n) + 1;
a = malloc ((n+1) * sizeof (int));
b = malloc ((n+1) * sizeof (int));
stramos = malloc ((n+1) * sizeof (int));
for (i=0; i <= n+1; ++i) {
a[i] = malloc (35 * sizeof (int));
stramos[i] = calloc ((t+1), sizeof (int));
a[i][0] = 0;
}
for (i=1; i <= n; ++i) {
fscanf (f, "%d", &x);
b[i] = x;
a[x] [++a [x][0]] = i;
}
cul = calloc ((n+1) , sizeof (int));
for (i=0; i <= n; ++i)
if (cul [i] == 0) dfs (i,0);
for (i=0; i<m; ++i) {
fscanf (f, "%d %d", &x, &y);
if (y > 3) fprintf (fout, "0\n");
else fprintf ( fout, "%d\n", stramos [x][y]);
}
fclose (f);
fclose (fout);
return 0;
}