Pagini recente » Cod sursa (job #717629) | Cod sursa (job #9607) | Cod sursa (job #1919547) | Cod sursa (job #1526465) | Cod sursa (job #1386006)
#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;
int q_size = query[pos].size();
for(int i = 0; i < q_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";
int d_size = descendants[pos].size();
for(int i = 0; i < d_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;
}