Pagini recente » Cod sursa (job #2972613) | Cod sursa (job #1895162) | Cod sursa (job #1858333) | Cod sursa (job #2390036) | Cod sursa (job #1150376)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("stramosi.in");
size_t n,m;
vector<unsigned> parent;
vector<vector<int>> ancestorCache;
unsigned getAncestor(size_t depth, unsigned id) {
if(ancestorCache.size() <= depth)
ancestorCache.resize(depth+1,vector<int>(n+1,-1));
if(ancestorCache[depth][id]!=-1) return ancestorCache[depth][id];
if(parent[id] == 0)
ancestorCache[depth][id] = 0;
else {
if(depth == 1) {
ancestorCache[depth][id] = parent[id];
}
else {
ancestorCache[depth][id] = getAncestor(depth-1,parent[id]);
}
}
return ancestorCache[depth][id];
}
void ReadData() {
in >> n >> m;
parent.resize(n+1);
for(size_t i = 1; i <= n; ++i)
in >> parent[i];
}
void SolveQueries() {
ofstream out("stramosi.out");
for(size_t i = 0; i < m; ++i) {
size_t depth;
unsigned nd;
in >> nd >> depth;
out << getAncestor(depth,nd) << '\n';
}
}
int main() {
ReadData();
SolveQueries();
return 0;
}