Cod sursa(job #471503)

Utilizator bent_larsenSturzu Antonio-Gabriel bent_larsen Data 19 iulie 2010 11:08:57
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<fstream>
#define maxstr 19

using namespace std;

int n,m;
vector<int> v[250001];
int stramosi[maxstr][250001];

void df2(int);

void df1()
{
	for(int i=1;i<=n;i++)
	{
		if(stramosi[0][i]==0)
			df2(i);
	}
}

void df2(int rad)
{
	int i,j;

	if(stramosi[0][rad]!=0)
	{
		int curent;
		curent=stramosi[0][rad];
		if(curent!=0)
		{
			for(j=1;j<maxstr;j++)
			{
				stramosi[j][rad]=stramosi[j-1][curent];
				curent=stramosi[j][rad];
				if(curent==0)
					break;
			}
		}
	}	
	for(i=0;i<(int) v[rad].size();i++)
		df2(v[i][rad]);
}	

int main()
{
	int stramos,nrbiti;

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

	memset(stramosi,0,sizeof(stramosi));
	in>>n>>m;
	for(int i=1;i<=n;i++)
	{
		in>>stramos;
		if(stramos)
			v[stramos].push_back(i);
		stramosi[0][i]=stramos;
	}
	//Preprocess the matrix
	df1();
	nrbiti=8*sizeof(int)-1;//platform independent code
	
	for(int i=1;i<=m;i++)
	{
		int p,q;
		in>>q>>p;
		int contor=nrbiti;
		stramos=q;

		while(contor>=0)
		{
			if(p&(1<<contor))
				stramos=stramosi[contor][stramos];
			contor--;
			if(stramos==0)
				break;
		}
		out<<stramos<<"\n";
	}
	in.close();
	out.close();
	return 0;
}