Cod sursa(job #92084)

Utilizator piroslPiros Lucian pirosl Data 14 octombrie 2007 03:08:20
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 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]; 
	
};

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 = 0;
		fscanf(in, "%d ", &k);
		persoana* p = new persoana();
		p->val = i+1;
		if(k == 0)
		{
			p->str = 0;
		}
		else
		{
			p->str = persoane[k-1]->str+1;
			p->stramosi[0] = persoane[k-1];
			fillInfo(p);
		}
		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;
}