Pagini recente » Cod sursa (job #2094803) | Cod sursa (job #1559074) | Cod sursa (job #1698661) | Cod sursa (job #1693867) | Cod sursa (job #1114341)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin ("stramosi.in");
ofstream fout ("stramosi.out");
const long N = 250001;
long n, m, s [N], dp [20][250001];
void read () {
long i;
fin >> n >> m;
for (i = 1; i <= n; i ++) {
fin >> s [i];
dp [0][i] = s [i];
}
}
void solve () {
long i, j, p2 = 1;
for (i = 1; ; i ++) {
p2 = p2 << 1;
if (p2 > n)
break;
for (j = 1; j <= n; j ++)
dp [i][j] = dp [i - 1][dp [i - 1][j]];
}
}
long bs (const long &a) {
long step, i;
step = (1 << 19);
for (i = 0; step; step >>= 1)
if (step <= a)
return step;
}
long query (long a, long b) {
long i, p, p2;
if ((b & (b - 1)) == 0) {
for (i = 0; i <= 20; i ++)
if (b & (1 << i)) {
p = i;
break;
}
return dp [p][a];
}
p2 = bs (b);
for (i = 0; i <= 20; i ++)
if (p2 & (1 << i)) {
p = i;
break;
}
return query (dp [p][a], b - p2);
}
int main () {
long i, a, b;
read ();
solve ();
for (i = 1; i<= m; i ++) {
fin >> a >> b;
fout << query (a, b) << "\n";
}
return 0;
}