Pagini recente » Cod sursa (job #1328518) | Cod sursa (job #615852) | Cod sursa (job #543258) | Cod sursa (job #838488) | Cod sursa (job #1110938)
#include <cstdio>
#include <stack>
#include <set>
#define FILEIN "stramosi.in"
#define FILEOUT "stramosi.out"
#define KMAX 18
using namespace std;
int P[KMAX][1<<KMAX];
int n, m;
set<int> Set;
void compute() {
for ( int i = 1; i <= n; i++ ) {
Set.insert(i);
}
for ( int j = 1; 1<<j <= n; j++ ) {
for ( set<int>::iterator iter = Set.begin(); iter != Set.end(); iter++ ) {
int i = *iter;
P[i][j] = P[P[i][j-1]][j-1];
if (!P[i][j]) {
Set.erase(i);
}
}
}
}
int query(int q, int p) {
int result = q;
stack<int> bits;
int poz = 0;
while (p != 0) {
if (p % 2)
bits.push(poz);
p /= 2;
poz++;
}
while (!bits.empty() && result != 0) {
result = P[result][bits.top()];
bits.pop();
}
return result;
}
int main() {
freopen(FILEIN, "r", stdin);
freopen(FILEOUT, "w", stdout);
scanf("%d %d", &n, &m);
for ( int i = 1; i <= n; i++ ) {
scanf("%d", &P[i][0]);
}
compute();
for ( int i = 1, p, q; i <= m; i++ ) {
scanf("%d %d", &q, &p);
printf("%d\n", query(q, p));
}
return 0;
}