Pagini recente » Cod sursa (job #2882190) | Cod sursa (job #740805) | Cod sursa (job #1890122) | Cod sursa (job #2162565) | Cod sursa (job #935342)
Cod sursa(job #935342)
#include <stdio.h>
#include <stdlib.h>
/* version 3, a bit of strength reduction */
/* BITS = nr de biti care sunt suficienti pentru a stoca N max */
#define BITS 18
int main(void)
{
FILE *fin, *fout;
int (*a)[BITS], n, m;
int i, j, current, step, skip;
if (!(fin = fopen("stramosi.in", "r"))) {
perror("Cannot open input file");
return 1;
}
if (!(fout = fopen("stramosi.out", "w"))) {
perror("Cannot open output file");
return 2;
}
fscanf(fin, "%d%d", &n, &m);
a = malloc((n + 1) * BITS * sizeof(int));
if (!a) {
fprintf(stderr, "Cannot allocate memory!\n");
return 3;
}
a[0][0] = 0;
for (i = 1; i <= n; i++)
fscanf(fin, "%d", &(a[i][0]));
for (i = 0; i <= n; i++) {
for (j = 1; j < BITS; j++) {
/* double skip */
current = a[i][j-1];
current = a[current][j-1];
a[i][j] = current;
}
}
for (i = 0; i < m; i++) {
fscanf(fin, "%d%d", ¤t, &j);
step = BITS - 1;
skip = 1 << step;
while (j > 0) {
if (j >= skip) {
current = a[current][step];
j = j - skip;
}
step--;
skip = skip >> 1;
}
fprintf(fout, "%d\n", current);
}
free(a);
fclose(fout);
fclose(fin);
return 0;
}