Cod sursa(job #481625)

Utilizator dcm9000Dinu Cristian Mircea - UPB dcm9000 Data 31 august 2010 23:24:16
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.82 kb
#include <iostream>
#include <algorithm>
#include <fstream>
#include <string>

using namespace std;

#define FILE_IN "stramosi.in"
#define FILE_OUT "stramosi.out"

int N, M;

int anc[250001][18];

int main()
{
	FILE* fisIn = fopen(FILE_IN, "r");
	FILE* fisOut = fopen(FILE_OUT, "w+");

	fscanf(fisIn, "%d %d", &N, &M);

	anc[0][0] = 0;
    for (int i=1; i<=N; i++) fscanf(fisIn, "%d", &anc[i][0]);

    for (int j=0; j<17; j++)
    {
		int jp1 = j+1;
		for (int i=0; i<=N; i++) anc[i][jp1] = anc[anc[i][j]][j];
	}

	for (int i=0; i<M; i++)
	{
		int P,Q;

		fscanf(fisIn, "%d %d", &Q, &P);

		while (P)
		{
			int bit = 31-__builtin_clz(P);
			if (bit > 17) { Q = 0; break; }
			
			P -= 1<<bit;
			Q = anc[Q][bit];
		}

		fprintf(fisOut, "%d\n", Q);
	}

	fclose(fisIn);
	fclose(fisOut);
}