Pagini recente » Cod sursa (job #322296) | Borderou de evaluare (job #1517958) | Cod sursa (job #798976) | Cod sursa (job #780951) | Cod sursa (job #2926855)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
#define MAXN 250000
#define LOG_MAXN 20
struct nod {
int d;
int par[LOG_MAXN];
std::vector <int> chd;
};
nod web[MAXN];
void init(int pos, int par) {
web[pos].par[0] = par;
int i = 1;
for(; i < LOG_MAXN && web[pos].par[i - 1] != -1; i++)
web[pos].par[i] = web[ web[pos].par[i - 1] ].par[i-1];
for(; i < LOG_MAXN; i++)
web[pos].par[i] = -1;
if ( par != -1 )
web[pos].d = web[par].d + 1;
else
web[pos].d = 0;
for ( int i = 0; i < web[pos].chd.size (); i++ )
init ( web[pos].chd[i], pos );
}
int parent(int pos, int depth) {
for(int i = LOG_MAXN - 1; i >= 0 && pos != -1; i--) {
if (depth >= (1 << i)) {
pos = web[pos].par[i];
depth -= 1 << i;
}
}
return pos;
}
int main() {
vector <int> roots;
int nrn, nrq;
int par, pos, depth;
fin >> nrn >> nrq;
for(int i = 0; i < nrn; i++) {
fin >> par;
if(par == 0) {
roots.push_back(i);
}
else {
web[--par].chd.push_back(i);
}
}
for(int i = 0; i < roots.size(); i++) {
init(roots[i], -1);
}
for(int i = 0; i < nrq; i++) {
fin >> pos >> depth;
pos--;
fout << parent(pos, depth) + 1 << '\n';
}
return 0;
}