Cod sursa(job #640771)

Utilizator mlupseLupse-Turpan Mircea mlupse Data 26 noiembrie 2011 14:36:39
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
using namespace std;
#include <cstdio>
#define DIM 8192
#define maxn 300001

char ax[DIM+16];
int pz;

inline void cit(int &x)
{
	x=0;
	while(ax[pz]<'0' || ax[pz]>'9')
		if(++pz==DIM)fread(ax, 1, DIM, stdin), pz=0;
	while(ax[pz]>='0' && ax[pz]<='9')
	{
		x=x*10+ax[pz]-'0';
		if(++pz==DIM)fread(ax,1, DIM, stdin),pz=0;
	}
}

struct nod { int x; nod *n;};
struct node{ int q, pos;node*n;};

nod *a[250001];
node *A[250001];
int n,m;
bool use[250001];
int tata[250001];
int sol[300001];
int st[250001];

void read()
{
	freopen("stramosi.in","r",stdin);
	scanf("%d %d\n",&n, &m);
	//cit(n);cit(m);
	int i,p,q;
	//printf("%d %d\n", n,m);
	for(i=1;i<=n;++i) 
	{
		scanf("%d ", &p);
		//cit(p);
		
		//printf("%d\n", p);
		
		tata[i]=p;
		nod *t=new nod;
		t->x=i;
		t->n=a[p];
		a[p]=t;
		
	}
	
	
	for(i=1;i<=m;++i)
	{
		scanf("%d %d\n", &p,&q);
		
		
		//cit(p);cit(q);
		node *t=new node;
		t->q=q;
		t->pos=i;
		t->n=A[p];
		A[p]=t;
	}
	
}

inline void dfs(int n, int k)
{
	use[n]=1;
	st[k]=n;
	
	for(node *i = A[n] ; i ; i = i->n)
		if(k >= i->q)
			sol[i->pos]=st[k-i->q];
		
	for(nod *i=a[n]; i; i=i->n)
		if(!use[i->x])
			dfs(i->x,k+1);
}

	

void solve()
{
	int i;
	
	for(i=1;i<=n;++i)
		if(!tata[i]) 
			dfs(i, 0);
		
	
	freopen("stramosi.out","w",stdout);	
	for(i=1;i<=m;++i)printf("%d\n", sol[i]);
}

int main()
{
	
	read();
	
	solve();
	
	return 0;
}