Cod sursa(job #974609)

Utilizator tudorv96Tudor Varan tudorv96 Data 17 iulie 2013 18:40:42
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <fstream>
#include <list>
#include <vector>
#include <iterator>
#include <algorithm>
#include <iostream>
using namespace std;

ifstream fin ("stramosi.in");
ofstream fout ("stramosi.out");

typedef pair <int, int> res;

#define sz (int)(st.size())

vector <vector <res> > q;
vector <list <int> > g;
vector <int> st, t, sol;
int n, m;

void dfs(int x) {
	for (vector <res> :: iterator it = q[x].begin(); it != q[x].end(); ++it) {
		if (sz >= (*it).first)
			sol[(*it).second] = st[sz-(*it).first];
		else
			sol[(*it).second] = 0;
	}
	st.push_back(x);
	for (list <int> :: iterator it = g[x].begin(); it != g[x].end(); ++it)
		dfs(*it);
	st.pop_back();
}

int main() {
	fin >> n >> m;
	g.resize(n+1);
	q.resize(n+1);
	t.resize(n+1);
	sol.resize(m);
	for (int i = 1; i <= n; ++i) {
		int x;
		fin >> x;
		g[x].push_back(i);
		t[i] = x;
	}
	for (int i = 0; i < m; ++i) {
		int x, y;
		fin >> x >> y;
		q[x].push_back(res(y, i));
	}
	fin.close();
	for (list <int> :: iterator it = g[0].begin(); it != g[0].end(); ++it)
		dfs(*it);
	copy (sol.begin(), sol.end(), ostream_iterator <int> (fout, "\n"));
	fout.close();
}