Cod sursa(job #730587)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 6 aprilie 2012 16:24:28
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include<cstdio>
#include<bitset>
#include<vector>
#define nmax 250050
#define mmax 300050
using namespace std;


vector<int>G[nmax],L1[nmax],L2[nmax];
int Find[mmax],St[nmax],q,p,ii,nod,niv,n,m;
bitset < 300009 > viz;
void dfs(int nd,int niv)  {
	St[niv]=nd;
	viz[nd]=1;
	for(int i=0;i<L1[nd].size();++i){
		
		ii=L2[nd][i];
		nod=L1[nd][i];
		
		if(niv<nod)
			Find[ii]=0;
		else
			Find[ii]=St[niv-nod];
	}
	
	for(int i=0;i<G[nd].size();++i)
		if(!viz[G[nd][i]])
			dfs(G[nd][i],niv+1);
	--niv;
}
int main () {
	freopen("stramosi.in","r",stdin);
	freopen("stramosi.out","w",stdout);
	scanf("%d%d",&n,&m);
	
	for(int i=1;i<=n;i++){
		int x;
		scanf("%d",&x);
		G[x].push_back(i);
	}
	
	
	for( int i=1 ; i<=m ; i++ ){
		scanf("%d%d",&q,&p);
		L1[q].push_back(p);
		L2[q].push_back(i);
	}
	
	for(int i=1;i<=n;i++)
		if(!viz[i])
			dfs(i,1);
	
	for(int i=1;i<=m;i++)
		printf("%d\n",Find[i]);
	
	return 0;
}