Cod sursa(job #774257)

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

int stramosi[MAXLN][MAXN];

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

/*
	1025 x

	   1 tz
*/

inline int find(int cnt, int x) {
	while (1) {
		int poz = 1;
		if (x == 0) return 0;
		int pow = 0;
		while (poz < cnt) {
			poz = poz << 1;
			pow ++;
		}
		if (poz == cnt) {
			return stramosi[pow][x];
		}
		cnt = cnt - (poz >> 1);
		x = stramosi[pow - 1][x];
	}
}

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[0][i] = 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[j][i] = stramosi[j - 1][stramosi[j - 1][i]];
		}
	}

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

}