Cod sursa(job #568360)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 31 martie 2011 09:26:49
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <fstream>
using namespace std;
#define DN 250005
#define DLGN 19

ifstream fi("stramosi.in");
ofstream fo("stramosi.out");

int N, logN, M, P, Q, T[DN][DLGN], D1[DN], D2[DN], R[DN], I[DN];

int cmp(int a, int b)
{
	return T[a][0] > T[b][0];
}

void prep1()
{
	for (int i = 2; i <= N; i++)
	{
		D1[i] = D1[i>>1] + 1;
		D2[i] = D2[(i+1)>>1] + 1;		
	}
}

void prep2()
{
	sort (I + 1, I + N + 1, cmp);
	int i, k;
	for (k = 2; k <= logN; k++)	
		for (i = 1; i <= N; i++)
		{
			if (T[I[i]][0] < k)
				break;
			T[I[i]][k] = T[T[I[i]][k-1]][k-1];
		}
}

int main()
{
	fi >> N >> M;
	prep1();
	
	for (int i = 1; i <= N; i++)
	{
		fi >> T[i][1];
		R[i] = R[T[i][1]] + 1;
		T[i][0] = D2[R[i]];
		if (T[i][0] > logN)
			logN = T[i][0];
		I[i] = i;
	}
	prep2();
	
	for (int i = 0; i < M; i++)
	{
		fi >> Q >> P;
		while (P != 0)
		{
			Q = T[Q][D1[P]+1];
			P -= 1 << D1[P];
		}	
		fo << Q << '\n';
	}	
}