Pagini recente » Cod sursa (job #1377508) | Cod sursa (job #1249729) | Cod sursa (job #1642280) | Cod sursa (job #1478029) | Cod sursa (job #928643)
Cod sursa(job #928643)
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
ifstream f("stramosi.in");
ofstream g("stramosi.out");
const int MAX_N = 250005;
int n, m, tata[MAX_N], nivel[MAX_N], where[MAX_N];
bool frunza[MAX_N];
vector <int> stramos[MAX_N]; // stramos[i] = lista de stramosi a frunzei i
void read() {
f >> n >> m;
for (int i = 1; i <= n; i++)
frunza[i] = 1;
for (int i = 1; i <= n; i++) {
f >> tata[i];
frunza[tata[i]] = 0;
}
}
void baga(int frunza) {
int nod = frunza;
while (tata[nod] != 0) {
stramos[frunza].push_back(tata[nod]);
where[nod] = frunza;
nivel[tata[nod]] = nivel[nod] + 1;
nod = tata[nod];
}
where[nod] = frunza;
}
void precompute() {
for (int i = 1; i <= n; i++)
if (frunza[i])
baga(i);
}
void solve() {
for (int i = 1; i <= m; i++) {
int Q, P;
f >> Q >> P;
int frnz = where[Q];
if (P == 0)
g << Q << '\n';
else if (P + nivel[Q] - nivel[frnz] - 1 >= stramos[frnz].size())
g << 0 << '\n';
else
g << stramos[frnz][P + nivel[Q] - nivel[frnz] - 1] << '\n';
}
}
int main() {
read();
precompute();
solve();
f.close();
g.close();
return 0;
}