Cod sursa(job #677366)

Utilizator Cosmin1490Balan Radu Cosmin Cosmin1490 Data 10 februarie 2012 03:10:03
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>
#include <vector>
#include <stack>
#include <map>
using namespace std;

#define NSIZE 250001
const char* infile = "stramosi.in";
const char* outfile = "stramosi.out";

vector<int> G[NSIZE];

multimap<int, pair<int, int> > Tabel;
vector<int> Solutii;
vector<int> stramosi;
pair<multimap<int, pair<int, int> >::iterator, multimap<int, pair<int, int > >::iterator > intrebari;


void DFS(int root)
{
	stramosi.push_back(root);

	intrebari = Tabel.equal_range(root);

	for( multimap<int, pair<int, int> >::iterator itr = intrebari.first;
		itr != intrebari.second;
		itr ++)
	{
		int P = itr->second.first;
		int index = itr->second.second;
		int raspuns;

		if((unsigned int) P > stramosi.size() -1 )
		{
			raspuns = 0;
		}
		else
		{
			raspuns = stramosi[stramosi.size() - 1 - P];
		}

		Solutii[index] = raspuns;
	}

	for(unsigned int i = 0; i < G[root].size(); ++i)
	{
		DFS(G[root][i]);
	}

	stramosi.pop_back();
}


int main()
{
	fstream fin(infile, ios::in);
	fstream fout(outfile, ios::out);
	int N, M;
	fin >> N >> M;

	for(int i = 0 ; i < N; i++)
	{
		int parinte;
		fin >> parinte;
		G[parinte].push_back(i+1);
	}
	
	Solutii.reserve(M+1);
	Solutii.resize(M+1);

	for(int i = 0 ; i < M; i++)
	{
		int Q, P;
		fin >> Q >> P;
		Tabel.insert(make_pair(Q, make_pair(P, i)));
	}

	DFS(0);

	for(int i = 0 ; i < M; i++)
	{
		fout << Solutii[i] << "\n";
	}

	fin.close();
	fout.close();
}