Cod sursa(job #660936)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 13 ianuarie 2012 15:06:36
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include <fstream>
#include <vector>
using namespace std;
#define DIM 250001 
#define tg (sw ? 0 : 1)

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

int N, M, P, Q;
int S[DIM][20];

void cit ()
{
	fi >> N >> M;
	for (int i = 1, x; i <= N; i++)
	{
		fi >> S[i][0];
	}
}

void prep ()
{
	int i, j, sw = 0, a[2][N+1], n;
	a[sw][0] = 0;
	for (i = 1; i <= N; i++)
		a[sw][++a[sw][0]] = i;
	for (j = 1; a[sw][0]; j++)
	{
		sw = tg;
		a[sw][0] = 0;
		for (i = 1; i <= a[tg][0]; i++)
		{
			n = a[tg][i];
			if (S[n][j-1] == 0)
				continue;
			a[sw][++a[sw][0]] = n;
			S[n][j] = S[S[n][j-1]][j-1];
		}
	}
}

void calc ()
{
	for (int r = 0; P != 0 && Q != 0; r++)
	{
		if (P >> r & 1)
		{
			P = P ^ (1 << r); 
			Q = S[Q][r]; 
		}
	}
}

int main ()
{
	cit ();
	prep ();
	while (M--)
	{
		fi >> Q >> P;
		calc ();
		fo << Q << '\n';
	}
	return 0;
}