Cod sursa(job #1112194)

Utilizator NistorSergiuNistor Sergiu NistorSergiu Data 19 februarie 2014 15:45:43
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.3 kb
#include <cstdio>
#include <vector>
using namespace std;
int stra[20][250001];
vector <int> gr[250001];
void dfs(int vf)
{
    int p2=0,nod=stra[0][vf],i;
    while(stra[p2][nod])
    {
        stra[p2+1][vf]=stra[p2][nod];
        nod=stra[p2][nod];
        p2++;
    }
    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))
		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 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[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;
}

/*#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 p2=20,mij,ps=1<<20;
	if(p>ps)
		return 0;
	while(p&&x)
	{
		if((1<<p2)<=p)
		{
			x=stra[x][p2];
			p-=(1<<p2);
		}
		else
			p2--;
	}
	if(x)
		return x;
	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;
}*/

/*#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;
}*/

/*#include <cstdio>
#include <vector>
using namespace std;
int stra[20][250001];
vector <int> gr[250001];
void dfs(int vf)
{
    int p2=0,nod=stra[0][vf],i;
    while(stra[p2][nod])
    {
        stra[p2+1][vf]=stra[p2][nod];
        nod=stra[p2][nod];
        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[mij][x];
			if(ps<p)
				st=mij;
			else
				dr=mij;
		}
		if((1<<st)==p)
			return stra[st][x];
		if((1<<dr)==p)
			return stra[dr][x];
		p-=(1<<st);
		x=stra[st][x];
	}
	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[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;
}
*/