Cod sursa(job #395085)

Utilizator dexter_dexMutascu Adrian - Dragos dexter_dex Data 12 februarie 2010 08:19:28
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <stdio.h>
#include <vector>

#define Nmax 250005
#define Mmax 300005

using namespace std;

vector <int> A[Nmax], B[Nmax], C[Nmax];

int n, m, p, q, x, niv, nod;
int viz[Nmax], S[Nmax], SOL[Mmax];
int j;


FILE * f = fopen ("stramosi.in", "r");
FILE * g = fopen ("stramosi.out", "w");


void DFS (int niv, int nod){
	
	int i;
	
	S [niv] = nod;
	viz[nod] = 1;
	/*for (i = 0 ; i < (int)A[nod].size() ; i++)
		if (viz[ A[nod][i] ] != 1){
			for (j = 0 ; j < (int)B[nod].size() ; j++)
				if (B[nod][j] < niv)
					SOL [ C[nod][j] ] = S[niv - B[nod][j]];
			DFS (niv + 1, A[nod][i]);
		}*/
	for (j = 0 ; j < (int)B[nod].size() ; j++)
				if (B[nod][j] < niv)
					SOL [ C[nod][j] ] = S[niv - B[nod][j]];
				else SOL [ C[nod][j] ] = 0;
				
	for (i = 0 ; i < (int)A[nod].size() ; i++)	
		if ( viz[ A[nod][i] ] != 1)DFS (niv + 1, A[nod][i]);
}


int main (){
	
	fscanf (f, "%d %d", &n, &m);
	
	for (i = 1 ; i <= n ; i++){
		fscanf (f, "%d", &x);
		A[x].push_back(i);
	}
	
	for (i = 1 ; i <= m ; i++){
		fscanf (f, "%d %d", &q, &p);
		B[q].push_back(p);		
		C[q].push_back(i);
	}
	
	DFS(1, 0);
	
	for (i = 1 ; i <= m ; i++)
		fprintf (g, "%d\n", SOL [i]);
		
	
	fclose(f);
	fclose(g);
	return 0;
}