Cod sursa(job #190664)

Utilizator hadesgamesTache Alexandru hadesgames Data 23 mai 2008 19:28:38
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <vector>
#include <stdio.h>
#include <queue>
using namespace std;
#define pb push_back
#define p push
#define fori(c,it) for(vector<int>::iterator it = (c).begin(); it != (c).end(); it++) 
queue<int> coada;
vector<vector<int> > a(250005),b(250005);
int put[250005],stra[250005],log[35];
int main()
{
	FILE *in,*out;
	int i,n,m,j,x,y;
	in=fopen("stramosi.in","r");
	out=fopen("stramosi.out","w");
	fscanf(in,"%d%d",&n,&m);
	for (i=1;i<=n;i++)
	{
		fscanf(in,"%d",&stra[i]);
		if(!stra[i])
			coada.p(i);
		else
			b[stra[i]].pb(i);
	}
	put[1]=0;
	x=2;
	y=1;
	for (i=2;i<=n;i++)
	{
		if (i==x)
		{
			x*=2;
			y++;
		}
		put[i]=y-1;
	
	}
	log[0]=1;
	for (i=1;i<=put[n];i++)
		log[i]=2*log[i-1];
	for (i=1;i<=n;i++)
		printf("%d ",put[i]);
	printf("\n");

	while (!coada.empty())
	{
		x=coada.front();
		coada.pop();
		for(vector<int>::iterator it=b[x].begin();it!=b[x].end();it++)
		{
			coada.p(*it);
			a[*it].pb(x);
			for (j=1;j<=a[x].size();j++)
			{
				a[*it].pb(a[a[*it][j-1]][j-1]);
			}
			
		}
		
	}
	for (i=1;i<=n;i++)
	{
		for(vector<int>::iterator it=a[i].begin();it!=a[i].end();it++)
			printf("%d ",*it);
		printf("\n");
	}
	for (i=1;i<=m;i++)
	{
		fscanf(in,"%d%d",&y,&x);
		while (x)
		{
			printf("%d %d %d %d\n",x,y,put[x],(int)a[y].size());
			if (put[x]>=a[y].size())
			{
				fprintf(out,"0\n");
				break;
			}
			y=a[y][put[x]];
			x-=log[put[x]];
		}
		if (!x)
			fprintf(out,"%d\n",y);
	}
	fclose(in);
	fclose(out);
	return 0;
}