Cod sursa(job #1112187)

Utilizator NistorSergiuNistor Sergiu NistorSergiu Data 19 februarie 2014 15:33:29
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
int stra[250001][20];
vector <int> gr[250001];
queue <int> q;
void dfs(int vf)
{
	int p2,nod,i;
	q.push(vf);
	while(!q.empty())
	{
		vf=q.front();
		q.pop();
		p2=0;nod=stra[vf][0];
		while(stra[nod][p2])
		{
			stra[vf][p2+1]=stra[nod][p2];
			nod=stra[nod][p2];
			p2++;
		}
		for(i=0;i<gr[vf].size();i++)
			q.push(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;
}