Cod sursa(job #774254)

Utilizator cvicentiuCiorbaru Vicentiu Marian cvicentiu Data 3 august 2012 22:54:25
Problema Stramosi Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <stdio.h>
#include <algorithm>
#include <vector>
#define MAXN 250001
#define MAXLN 18
using namespace std;

int stramosi[MAXN][MAXLN];

//stramosi[i][j] = (2^j) a lui i

/*
	1025 x

	   1 tz
*/

int find(int cnt, int x) {
	fprintf(stderr, "Finding %d %d\n", x, cnt);
	int poz = 1;
	if (x == 0) return 0;
	int pow = 0;
	while (poz < cnt) {
		poz = poz << 1;
		pow ++;
	}
	if (poz == cnt) {
		return stramosi[x][pow];
	}
	return find(cnt - (poz >> 1), stramosi[x][pow - 1]);
}

int main() {

	FILE *f = fopen("stramosi.in", "r");
	FILE *g = fopen("stramosi.out", "w");

	int n, m;
	
	vector<int> tati;
	tati.push_back(0);

	fscanf(f, "%d%d", &n, &m);
	for (int i = 1; i <= n; i++) {
		int x;
		fscanf(f, "%d", &x);
		tati.push_back(x);
		stramosi[i][0] = x;
	}

	for (int i = 0; i <= n; i++) {
		for (int j = 0; j < MAXLN; j++) {
			fprintf(stderr, "%d ", stramosi[i][j]);
		}
		fprintf(stderr, "\n");
	}
	fprintf(stderr, "\n");
	
	for (int j = 1; j < MAXLN; j++) {
		for (int i = 1; i <= n; i++) {
			stramosi[i][j] = stramosi[stramosi[i][j - 1]][j - 1];
		}
	}

	for (int i = 0; i <= n; i++) {
		for (int j = 0; j < MAXLN; j++) {
			fprintf(stderr, "%d ", stramosi[i][j]);
		}
		fprintf(stderr, "\n");
	}

	
	for (int i = 0; i < m; i++) {
		int x, cnt;
		fscanf(f, "%d%d", &x, &cnt);
		fprintf(g, "%d\n", find(cnt, x));
	}
	fclose(f);
	fclose(g);

}