Pagini recente » Istoria paginii utilizator/invatacel | Monitorul de evaluare | Istoria paginii utilizator/costelus1 | Monitorul de evaluare | Cod sursa (job #2243360)
#include <bits/stdc++.h>
using namespace std;
struct Read {
ifstream f;
Read (const string &input) {
f.open (input);
}
string s;
int pos = (1 << 30), sz = 0, ret = 0;
int getNextInt() {
ret = 0;
while (pos < sz && '0' <= s[pos] && s[pos] <= '9') {
ret *= 10;
ret += s[pos] - '0';
++pos;
}
++pos;
return ret;
}
int nextInt() {
if (pos >= sz) {
getline (f, s);
pos = 0;
sz = s.size();
}
return getNextInt();
}
};
Read in ("stramosi.in");
ofstream g ("stramosi.out");
vector <int> v;
vector < vector <int> > dp;
int log2 (int n) {
int ret = 0;
while ((1 << ret) <= n) ++ret;
return ret;
}
int main() {
int n = in.nextInt();
int m = in.nextInt();
v.resize (n + 1, 0);
for (int i = 1; i <= n; ++i) {
v[i] = in.nextInt();
}
int lg = log2 (n);
dp.resize (lg + 1);
for (int i = 0; i <= lg; ++i) {
dp[i].resize (n + 1, 0);
for (int j = 1; j <= n; ++j) {
if (i == 0) {
dp[i][j] = v[j];
} else {
dp[i][j] = dp[i - 1][dp[i - 1][j]];
}
}
}
while (m--) {
int q = in.nextInt();
int p = in.nextInt();
int ans = 0;
for (int bit = 0; bit < lg; ++bit) {
if (!(p & (1 << bit))) continue;
q = dp[bit][q];
}
g << q << '\n';
}
g.close();
return 0;
}