Cod sursa(job #935341)

Utilizator alexpaliasAlex P alexpalias Data 3 aprilie 2013 00:37:25
Problema Stramosi Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <stdio.h>
#include <stdlib.h>

/* version 1, dumb - should time out */

/* 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;

	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", &current, &j);
		step = BITS - 1;

		while (j > 0) {
			if (j >= (1 << step)) {
				current = a[current][step];
				j = j - (1 << step);
			}
			step--;
		}

		fprintf(fout, "%d\n", current);
	}

	free(a);
	fclose(fout);
	fclose(fin);

	return 0;
}