Pagini recente » Cod sursa (job #2618461) | Cod sursa (job #326771) | Cod sursa (job #2616422) | Cod sursa (job #613807) | Cod sursa (job #3240895)
#include <stdio.h>
const int MAXN = 250'000;
const int MAX_LOG = 18;
int parent[MAXN + 1];
int dp[MAX_LOG + 1][MAXN + 1];
int main() {
FILE *fin, *fout;
int n, m, i, j, q, p, bit;
fin = fopen("stramosi.in", "r");
fscanf(fin, "%d%d", &n, &m);
for(i = 1; i <= n; i++) {
fscanf(fin, "%d", &parent[i]);
}
for(i = 1; i <= n; i++) {
dp[0][i] = parent[i];
}
for(i = 1; i <= MAX_LOG; i++) {
for(j = 1; j <= n; j++) {
// vrem sa avansam o data cu 2^j, asa ca avansam de 2 ori cu 2^(j-1)
dp[i][j] = dp[i - 1][dp[i - 1][j]];
}
}
fout = fopen("stramosi.out", "w");
for(i = 0; i < m; i++) {
fscanf(fin, "%d%d", &q, &p);
// vrem p pozitii in fata pentru q
bit = 0;
while(p > 0) {
if(p & 1) {
q = dp[bit][q];
}
bit++;
p >>= 1;
}
fprintf(fout, "%d\n", q);
}
fclose(fout);
fclose(fin);
return 0;
}