Cod sursa(job #660937)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 13 ianuarie 2012 15:08:55
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[20][DIM];

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

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[j-1][n] == 0)
				continue;
			a[sw][++a[sw][0]] = n;
			S[j][n] = S[j-1][S[j-1][n]];
		}
	}
}

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

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