Pagini recente » Cod sursa (job #732269) | Cod sursa (job #3039690) | Cod sursa (job #3261519) | Cod sursa (job #186659) | Cod sursa (job #1386004)
#include<vector>
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;
int stack[250005];
vector<int> ancestors;
vector<int> descendants[250005];
vector<int> query[300005];
vector<int> solution[300005];
vector<int> zeros;
vector<pair<int, int> > queryInOrder;
void dfs(int pos, int depth) {
// cout << "pos:" << pos << " depth" << depth << " -> ";
stack[depth] = pos;
for(int i = 0; i < query[pos].size(); ++i) {
// cout << "qPos:" << query[pos][i] << " val:";
if(query[pos][i] >= depth) {
// cout << "0";
solution[pos][i] = 0;
}
else {
// cout << stack[depth - query[pos][i]];
solution[pos][query[pos][i]] = stack[depth - query[pos][i]];
}
}
// cout << "\n";
for(int i = 0; i < descendants[pos].size(); ++i) {
dfs(descendants[pos][i], depth + 1);
}
}
int main() {
ifstream fin ("stramosi.in");
ofstream fout("stramosi.out");
int N,M;
fin >> N >> M;
ancestors.push_back(0);
for(int i = 1; i <= N; ++i) {
int x; fin >> x;
ancestors.push_back(x);
descendants[x].push_back(i);
if(x == 0) {
zeros.push_back(i);
}
}
for(int i = 0; i < M; ++i) {
int P,Q; fin >> Q >> P;
query[Q].push_back(P);
solution[Q].push_back(0);
queryInOrder.push_back(make_pair(Q,P));
}
int z_size = zeros.size();
for(int i = 0; i < z_size; ++i) {
dfs(zeros[i], 1);
}
for(int i = 0; i < M; ++i) {
fout << solution[queryInOrder[i].first][queryInOrder[i].second] << '\n';
}
return 0;
}