Pagini recente » Atasamentele paginii oji_bv_2022 | Cod sursa (job #2171472) | Cod sursa (job #2898159) | Cod sursa (job #2962089) | Cod sursa (job #2066570)
#include <fstream>
#include <vector>
#include <queue>
#define MAXN 250005
#define MAXM 300005
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
int n, m, query[MAXM], stiva[MAXN], nn;
struct punct{
int k, nr_ordine;
};
vector <int> G[MAXN];
vector <punct> Query[MAXN];
queue <int> Q;
inline void Read() {
int aux, q, p;
fin >> n >> m;
for (int i = 1; i <= n; i++) {
fin >> aux;
if (!aux)
Q.push(i);
else
G[aux].push_back(i);
}
for (int i = 1; i <= m; i++){
fin >> q >> p;
Query[q].push_back({p, i});
}
}
inline void DFS() {
int nod = stiva[nn];
for (auto x : Query[nod]) {
query[x.nr_ordine] = stiva[nn - x.k];
}
for (auto x : G[nod]) {
stiva[++nn] = x;
DFS();
}
nn--;
}
inline void Solve() {
int z;
while (!Q.empty()) {
z = Q.front();
stiva[nn = 1] = z;
DFS();
Q.pop();
}
}
inline void Write() {
for (int i = 1; i <= m; i++)
fout << query[i] << "\n";
}
int main () {
Read();
Solve();
Write();
fin.close(); fout.close(); return 0;
}