Pagini recente » Cod sursa (job #2069519) | Cod sursa (job #2116151) | Cod sursa (job #2048590) | Cod sursa (job #1242520) | Cod sursa (job #1114375)
#include <fstream>
#include <cstdio>
#include <vector>
using namespace std;
const long SIZE = 8000000;
class myIfstream {
public :
myIfstream ();
myIfstream (const char *input_name) {
input = fopen (input_name, "r");
cursor = 0;
fread (buffer, SIZE, 1, input);
}
inline myIfstream &operator >> (long& x) {
while (buffer [cursor] < '0' || buffer [cursor] > '9')
advance ();
x = 0;
while (buffer [cursor] >= '0' && buffer [cursor] <= '9') {
x = x * 10 + buffer [cursor] - '0';
advance ();
}
return *this;
}
private :
FILE *input;
char buffer [SIZE];
long cursor;
void advance () {
++ cursor;
if (cursor == SIZE) {
cursor = 0;
fread (buffer, SIZE, 1, input);
}
}
};
myIfstream fin ("stramosi.in");
ofstream fout ("stramosi.out");
const long N = 250001;
long n, m, s [N], dp [20][250001], lg [20], lg2 [N];
void read () {
long i;
fin >> n >> m;
for (i = 1; i <= n; i ++) {
fin >> s [i];
dp [0][i] = s [i];
}
lg [0] = 1;
for (i = 1; i <= 17; i ++) {
lg [i] = lg [i - 1] << 1;
lg2 [lg [i]] = 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 query (long a, long b) {
long i, p, p2;
if ((b & (b - 1)) == 0) {
p = lg2 [b];
return dp [p][a];
}
for (p2 = 1; p2 < b; p2 <<= 1);
p2 >>= 1;
p = lg2 [p2];
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;
}