Cod sursa(job #494837)

Utilizator space.foldingAdrian Soucup space.folding Data 23 octombrie 2010 02:16:58
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <cstdio>
#include <vector>
int v[250001], leaves[250001];
int main ()
{
	std::vector < std::vector <int> > vv;
	FILE *in=fopen("stramosi.in", "r"), *out=fopen("stramosi.out", "w");
	int n, m, value, s1, s2;
	fscanf(in, "%d%d", &n, &m);
	for(int i=0; i<n; ++i)
	{
		fscanf(in, "%d", v+i+1);
		leaves[v[i+1]]=-1;
	}
	vv.push_back(std::vector <int>());//primul nu ne intereseaza vv[0]
		
	for(int i=1; i<=n; ++i)
	{
		if(!leaves[i])
		{
			value=i;
			vv.push_back(std::vector <int>());
			vv[vv.size()-1].push_back(i);
			leaves[value]=vv.size()-1;
			while(v[value]!=0)
			{
				value=v[value];
				vv[vv.size()-1].push_back(value);
				leaves[value]=vv.size()-1;
			}
		}
	}				
			

	for(int i=0; i<m; ++i)
	{
		fscanf(in, "%d%d", &s1, &s2);
		value=leaves[s1];
		int j=0;
		for(;vv[value][j]!=s1; ++j);

		if(s2+j<vv[value].size())
			fprintf(out, "%d\n", vv[value][s2+j]);
		else
			fprintf(out, "0\n");
	}
	return 0;
}