Cod sursa(job #1112206)

Utilizator NistorSergiuNistor Sergiu NistorSergiu Data 19 februarie 2014 16:03:28
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include <cstdio>
#include <vector>
using namespace std;
int stra[20][250001];
int n;
vector <int> gr[250001];
void dfs(int vf)
{
    int i;
	for(i=1;(1<<i)<=n;i++)
		stra[i][vf]=stra[i-1][stra[i-1][vf]];
    for(i=0;i<gr[vf].size();i++)
        dfs(gr[vf][i]);
}

int cauta(int x, int p)
{
	int p2=20,mij;
	if(p>(1<<(20+1)))
		return 0;
	while(p&&x)
	{
		if((1<<p2)<=p)
		{
			x=stra[p2][x];
			p-=(1<<p2);
		}
		else
			p2--;
	}
	if(x)
		return x;
	return 0;
}
int main()
{
    int 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[0][i]);
        gr[stra[0][i]].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;
}