Cod sursa(job #1112179)

Utilizator NistorSergiuNistor Sergiu NistorSergiu Data 19 februarie 2014 15:27:57
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>
#include <vector>
using namespace std;
int stra[250001][20];
vector <int> gr[250001];
void dfs(int vf)
{
    int p2=0,nod=stra[vf][0],i;
    while(stra[nod][p2])
    {
        stra[vf][p2+1]=stra[nod][p2];
        nod=stra[nod][p2];
        p2++;
    }
    for(i=0;i<gr[vf].size();i++)
        dfs(gr[vf][i]);
}
int cauta(int x, int p)
{
	int st,dr,mij,ps;
	if(p>(1<<20))
		return 0;
	while(x)
	{
		st=0;dr=20;
		while((dr-st)>1)
		{
			mij=(st+dr)/2;
			ps=1<<mij;
			if(ps==p)
				return stra[x][mij];
			if(ps<p)
				st=mij;
			else
				dr=mij;
		}
		if((1<<st)==p)
			return stra[x][st];
		if((1<<dr)==p)
			return stra[x][dr];
		p-=(1<<st);
		x=stra[x][st];
	}
	return 0;
}
int main()
{
    int n,m;
    int i;
	int x,p;
    freopen("stramosi.in","r",stdin);
    scanf("%d %d\n",&n,&m);
    for(i=1;i<=n;i++)
    {
        scanf("%d ",&stra[i][0]);
        gr[stra[i][0]].push_back(i);
    }
    dfs(0);
    freopen("stramosi.out","w",stdout);
	for(i=0;i<m;i++)
	{
		scanf("%d %d\n",&x,&p);
		printf("%d\n",cauta(x,p));
	}
	fclose(stdin);
	fclose(stdout);
    return 0;
}