Pagini recente » Cod sursa (job #2155304) | Cod sursa (job #1255229) | Cod sursa (job #1298102) | Cod sursa (job #1698599) | Cod sursa (job #771145)
Cod sursa(job #771145)
#include <cstdio>
#include <fstream>
#include <cmath>
#include <string>
#include <cstring>
using namespace std;
const int N = 250005;
int n, m, dim, x, y, sol, nr;
int tata[N];
int stramosi[20][N];
char s[1760000];
int main()
{
freopen ("stramosi.in", "r", stdin);
freopen ("stramosi.out", "w", stdout);
fgets(s, 20, stdin);
dim = strlen(s);
for(int i = 0; i < dim; ++i) {
nr = 0;
while(isdigit(s[i])) {
nr = nr * 10 + s[i] - '0';
++i;
}
if(n != 0)
m = nr;
else n = nr;
}
memset(s, 0, sizeof(s));
fgets(s, 1750005, stdin);
dim = strlen(s);
for(int i = 0; i < dim; ++i) {
nr = 0;
while(isdigit(s[i])) {
nr = nr * 10 + s[i] - '0';
++i;
}
++tata[0];
tata[tata[0]] = nr;
stramosi[0][tata[0]] = tata[tata[0]];
}
tata[0] = 0;
dim = ceil(log2(n));
for(int i = 1; i <= dim; ++i)
for(int j = 1; j <= n; ++j)
stramosi[i][j] = stramosi[i - 1][stramosi[i - 1][j]];
for(int i = 1; i <= m; ++i) {
x = y = 0;
memset(s, 0, sizeof(s));
fgets(s, 20, stdin);
dim = strlen(s);
for(int j = 0; j < dim; ++j) {
nr = 0;
while(isdigit(s[j])) {
nr = nr * 10 + s[j] - '0';
++j;
}
if(x != 0)
y = nr;
else x = nr;
}
fprintf(stderr, "%d %d\n", x, y);
int k = 0;
while((1 << (k + 1)) < y)
++k;
sol = stramosi[k][x];
for(int j = 1; j <= (y - (1 << k)) ; ++j)
sol = tata[sol];
printf("%d\n", sol);
}
return 0;
}