Pagini recente » Cod sursa (job #2273703) | Cod sursa (job #1018) | Cod sursa (job #3041747) | Cod sursa (job #145768) | Cod sursa (job #1386075)
#include<vector>
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;
int stack[250005];
int actual[300005];
vector<int> ancestors;
vector<int> descendants[250005];
vector<int> queryInOrder;
vector<int> query [300005];
vector<int> solution[300005];
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].push_back(0);
}
else {
//cout << stack[depth - query[pos][i]];
solution[pos].push_back(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;
vector<int> zeros;
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);
queryInOrder.push_back(Q);
}
int z_size = zeros.size();
// cout << "zsize:" << z_size << "\n";
for(int i = 0; i < z_size; ++i) {
//cout << "zeros[i]:" << zeros[i] << "\n";
dfs(zeros[i], 1);
}
// cout << "out\n";
for(int i = 0; i < M; ++i) {
// cout << "queryInOrder[i]:" << queryInOrder[i] << " actual[queryInOrder[i]]:"
// << actual[queryInOrder[i]] << endl;
fout << solution[queryInOrder[i]][actual[queryInOrder[i]]++] << '\n';
// cout << "afterplus:" << actual[queryInOrder[i]] << endl;
}
return 0;
}