Pagini recente » Monitorul de evaluare | Borderou de evaluare (job #631001) | Cod sursa (job #1962857)
#include <fstream>
using namespace std;
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
const int NMAX = 250001;
const int LGMAX = 21;
int dp[LGMAX][NMAX];
int n, m;
inline void read() {
fin >> n >> m;
for (int i = 1; i <= n; ++i)
fin >> dp[0][i];
for (int lg = 1; lg < LGMAX; ++lg)
for (int i = 1; i <= n; ++i)
dp[lg][i] = dp[lg - 1][dp[lg - 1][i]];
}
inline int query(int x, int y) {
for (int lg = 0; (1 << lg) <= y; ++lg) {
if (y & (1 << lg))
x = dp[lg][x];
}
return x;
}
inline void solve() {
int x, y;
while (m--) {
fin >> x >> y;
fout << query(x, y) << '\n';
}
}
int main()
{
read();
solve();
fin.close();
fout.close();
return 0;
}