Cod sursa(job #432133)

Utilizator nautilusCohal Alexandru nautilus Data 1 aprilie 2010 20:59:47
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include<fstream>
#include<vector>
#define dmax 250002
#define dmax2 300002
using namespace std;

vector<long> a[dmax];
vector<long> b[dmax2],b2[dmax2];

int vizitat[dmax];
long sol[dmax2],s[dmax];


void dfs(long nod, long nivel)
{
 long i,elem;
	
 vizitat[nod]=1;
 s[nivel]=nod; /*s[x] - elementul care se afla pe nivelul x*/
 
 for (i=0; i<b[nod].size(); i++) /*determin stramosii lui nod*/
	 {
	  elem=b[nod][i];
	  if (nivel-elem > 0)
		  sol[b2[nod][i]]=s[nivel-elem]; else
		  sol[b2[nod][i]]=0;
	 }
 
 for (i=0; i<a[nod].size(); i++) /*parcurg vecinii lui nod*/
	 if (vizitat[a[nod][i]]==0)
		 dfs(a[nod][i],nivel+1);
}

int main()
{
 long n,m,x,y,i;
	
 ifstream fin("stramosi.in");
 fin>>n>>m;
 for (i=1; i<=n; i++)
	 {
	  fin>>x;
	  a[x].push_back(i);
	 }
 for (i=1; i<=m; i++)
	 {
	  fin>>x>>y;
	  b[x].push_back(y); /*b[x] - lista cu stramosii care trebuie det ai lui x */
	  b2[x].push_back(i); /*b2[x] - pozitia la citire/scriere*/
	 }
	
 for (i=1; i<=n; i++)
	 if (vizitat[i]==0)
		 dfs(i,1);

 ofstream fout("stramosi.out");
 for (i=1; i<=m; i++)
	 fout<<sol[i]<<'\n';
 
 fin.close();
 fout.close();
 
 return 0;
}