Pagini recente » Cod sursa (job #1676140) | Cod sursa (job #1417629) | Cod sursa (job #1214190) | Cod sursa (job #2309034) | Cod sursa (job #3289589)
#include <fstream>
using namespace std;
const int nmax = 2e5;
const int lmax = 20;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
int n, m, l, q, p, dp[lmax + 1][nmax + 1];
int stramos(int q, int p) {
// Care este al P-lea stramos al membrului cu numarul Q?
int nod = q;
// cautare binara pe bitii lui p
for (int i = 0; i < l; i++) {
if ((1 << i) & p) {
nod = dp[i][nod];
}
}
return nod;
}
void precalc() {
// l = exponentul puterii a lui 2 cea mai mare pana in n
while ((1 << l) <= n)
l++;
for (int i = 1; i < l; i++) {
for (int j = 1; j <= n; j++) {
int prv = dp[i - 1][j];
if (prv != 0)
dp[i][j] = dp[i - 1][prv];
else
dp[i][j] = 0;
}
}
}
int main() {
fin >> n >> m;
for (int i = 1; i <= n; i++)
fin >> dp[0][i];
precalc();
while (m--) {
fin >> q >> p;
fout << stramos(q, p) << '\n';
}
return 0;
}