Cod sursa(job #351284)

Utilizator laserbeamBalan Catalin laserbeam Data 27 septembrie 2009 14:42:02
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
// Catalin Balan
// Infoarena - Stramosi
//Sun Sep 27 13:17:34 EEST 2009

#include <cstdio>
#include <cstdlib>

#define NMAX 250001
#define CHUNK 8192

#define FIN "stramosi.in"
#define FOUT "stramosi.out"

char g_buf[CHUNK];
int g_p = CHUNK-1;

inline int get(FILE *f)
{
	int x = 0;
	while (g_buf[g_p] < '0' || g_buf[g_p] > '9')
		if (++g_p == CHUNK) 
		{
			fread(g_buf,1,CHUNK,f);
			g_p=0;
		}

	while (g_buf[g_p] >= '0' && g_buf[g_p] <= '9')
	{
		x = x*10 + g_buf[g_p]-'0';
		if (++g_p == CHUNK) 
		{
			fread(g_buf,1,CHUNK,f);
			g_p=0;
		}
	}
	return x;
}

int parent[NMAX][19];

void init(int n)
{
	for (int j = 1; j <= 18; ++j)
	{
		for (int i = 1; i <= n; ++i)
		{
			parent[i][j]=parent[ parent[i][j-1] ][j-1];
		}
	}
}

int answer(int p, int q)
{
	for (int i = 18; i >=0 && q; --i)
	{
		if (q >= (1<<i))
		{
			if (parent[p][i] == 0) return 0;
			p = parent[p][i];
			q -= 1<<i;
		}
	}
	return p;
}


int main()
{
	int n,m,p,q;
	FILE *f = fopen(FIN,"r");
	FILE *g = fopen(FOUT,"w");
	
	n = get(f);
	m = get(f);

	for (int i = 1; i <= n; ++i)
		parent[i][0]=get(f);
	
	init(n);
	for (int i = 1; i <= m; ++i)
	{
		p = get(f);
		q = get(f);
		fprintf(g,"%d\n", answer(p,q));
	}

	fclose(f);
	fclose(g);
	return EXIT_SUCCESS;
}