Pagini recente » Cod sursa (job #2172524) | Cod sursa (job #2379655) | Cod sursa (job #509710) | Cod sursa (job #312374) | Cod sursa (job #3247491)
#include <bits/stdc++.h>
using namespace std;
ifstream in("stramosi.in");
ofstream out("stramosi.out");
const int maxp2 = 19, nmax = 250005;
int stramos[maxp2][nmax]; // stramos[i][j] -> stramosul 2^i al nodului j
int n, m;
void PrecalculateAncestors()
{
for (int i = 1; i < maxp2; i++)
{
for (int j = 1; j <= n; j++)
{
stramos[i][j] = stramos[i - 1][stramos[i - 1][j]]; // impart intervalul in 2^(i-1) de 2 ori
}
}
}
int FindAncestor(int node, int kth)
{
if (kth >= (1 << maxp2))
return 0;
for (int i = 0; i < maxp2; i++)
{
if (kth & (1 << i)) // numarul stramosului se imparte la 2^i -> mut nodul 2^i pozitii mai sus
{
node = stramos[i][node];
}
}
return node;
}
int main()
{
int q, p;
in >> n >> m;
for (int i = 1; i <= n; i++)
{
in >> stramos[0][i];
}
PrecalculateAncestors();
for (int i = 1; i <= m; i++)
{
in >> q >> p; // al p-lea stramos al nodului q
out << FindAncestor(q, p) << '\n';
}
return 0;
}