Cod sursa(job #1222831)

Utilizator yololy97Olaru Bogdan-Ioan yololy97 Data 24 august 2014 15:08:46
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <cstdio>
#include <vector>
#define N 250001
using namespace std;
struct nod{
		int question, answer;
		nod(){};
		nod(int q, int a){
			question = q;
			answer = a;
		}
};
vector<nod> A[N];
vector<int> a[N];
vector<int> b;
int node[N], k[N], pos[N], p[N], n, m;
bool used[N], use[N];
void read(){
	scanf("%d %d ", &n, &m);
	int x;
	for(int i = 1; i <= n; ++i){
		scanf("%d ", &x);
		if(x)
			a[x].push_back(i);
		else
			used[i] = 1;
	}
	for(int i = 1; i <= m; ++i){
		scanf("%d %d ", &node[i], &k[i]);
		A[node[i]].push_back(nod(k[i], 0));
	}
}
void dfs(int t){
	use[t] = true;
	b.push_back(t);
	for(int i = 0; i < A[t].size(); ++i)
		if(A[t][i].question + 1 <= b.size()) 
			A[t][i].answer = b[b.size() - A[t][i].question - 1];
	for(vector<int>::iterator it = a[t].begin(); it != a[t].end(); ++it)
		if(!use[*it])
			dfs(*it);
	b.pop_back();
}
void solve(){
	for(int i = 1; i <= n; ++i)
		if(used[i]){
			dfs(i);
		}
	for(int i = 1; i <= m; ++i)
		printf("%d\n", A[node[i]][p[node[i]]++].answer);
}
int main(){
	freopen("stramosi.in", "r", stdin);
	freopen("stramosi.out", "w", stdout);
	read();
	solve();
	return 0;
}