Cod sursa(job #766169)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 10 iulie 2012 15:11:37
Problema Stramosi Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include<fstream>
#define LE 250500
#include <cstring>
using namespace std;
ifstream f("stramosi.in");
ofstream g("stramosi.out");
int father[LE],prev[LE],j,n,q,level,M[LE][19],viz[LE],i,nod,two[30],le[LE],levg,leev,lev_ned;
string s;
int l;
void query()
{
	for(j=le[nod];j>=0;--j)
		if (M[nod][j]&&two[j]<=lev_ned)
			nod=M[nod][j],lev_ned-=two[j],query();
}
void setM(int pos)
{
	prev[father[pos]]=pos;

	if (prev[pos]!=0)
	{
	  	for(j=0;j<=le[prev[pos]]&&M[prev[pos]][j]!=0;++j)
			M[pos][j]=father[M[prev[pos]][j]];

	return;
	}

	int lev_need=1,lev=0,k=pos,pe=0;

	while (father[k]!=0)
		{
		   ++lev;
		   k=father[k];

		   if (lev==lev_need)
			   M[pos][pe++]=k,lev_need*=2,le[pos]=pe-1;
	    }
}
int main()
{
f>>n>>q;f.get();
n=1;
getline(f,s);
l=s.length();


	for(i=0;i<l;++i)
		if (s[i]!=' ') father[n]=father[n]*10+s[i]-'0';
	else ++n;

two[0]=1;
for(i=1;i<=22;++i)
	two[i]=two[i-1]*2;

for(i=1;i<=n;++i)
       if (viz[i]!=-1)
	     setM(i);

	for(i=1;i<=q;++i)
	{
		f>>nod>>lev_ned;
		query();
		if (lev_ned!=0) g<<0<<'\n'; else
g<<nod<<'\n';
	}

f.close();g.close();
	return 0;
}