Cod sursa(job #92095)

Utilizator piroslPiros Lucian pirosl Data 14 octombrie 2007 03:17:15
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <stdio.h>
#include <stdio.h>
#include <math.h>
class persoana
{
public:
	persoana() 
	{
		str = 0;
		val = 0;
		for(int i=0;i<18;++i)
			stramosi[i] = 0;
	}

	int str;
	int val;
	persoana* stramosi[18]; 
	
};

int num[250001];

persoana persoane[250001];
int sol[300001];

persoana& getStr(persoana& p, int k)
{
	if(k==1)
		return *(p.stramosi[0]);
	
	int p2 = 2;
	int put = 1;
	while(p2<=k)
	{
		p2*=2;
		put++;
	}
	if(p2/2 == k)
		return *(p.stramosi[put-1]);

	return getStr(*(p.stramosi[put-1]), k-p2/2);
}

void fillInfo(persoana& p)
{
	int k = 2;
	int put = 1;
	while(k<=p.str) 
	{
		p.stramosi[put] = &(getStr(*(p.stramosi[put-1]), k/2));
		put++;
		k *= 2;
	}
}

int main(void)
{
	FILE* in;
	FILE* out;

	int n,m;
	in = fopen("stramosi.in", "r");
	out = fopen("stramosi.out", "w");
	
	fscanf(in, "%d %d\n", &n, &m);
	for(int i=0;i<n;++i) 
	{
		int k;
		fscanf(in, "%d ", &k);
		num[i] = k;
	}

	for(int i=0;i<n;++i) 
	{
		//persoana* p = new persoana();
		persoane[i].val = i+1;
		if(num[i] == 0)
		{
			persoane[i].str = 0;
		}
		else
		{
			persoane[i].str = persoane[num[i]-1].str+1;
			persoane[i].stramosi[0] = &(persoane[num[i]-1]);
			fillInfo(persoane[i]);
		}
	//	persoane[i] = p;
	}

	for(int i=0;i<m;++i) 
	{
		int p,q;
		fscanf(in, "%d %d\n", &q, &p);
		if(p>persoane[q-1].str)
			sol[i] = 0;
		else
			sol[i] = getStr(persoane[q-1], p).val;
	}

	
	for(int i=0;i<m;++i) 
	{
		fprintf(out, "%d\n", sol[i]);
	}

/*	for(int i=0;i<n;++i) 
	{
		delete persoane[i];
	}
*/
	fclose(in);
	fclose(out);
	return 0;
}