Pagini recente » Cod sursa (job #2156504) | Cod sursa (job #1264448) | Cod sursa (job #3266948) | Cod sursa (job #2870841) | Cod sursa (job #3221567)
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAXL 19
#define MAXN 250000
int st[MAXL + 1][MAXN + 1];//in st[i][j] tin care este al 2^i lea stramos al lui j
int readInt(FILE *fin) {
char ch;
int x;
ch = fgetc(fin);
while (isspace(ch)) {
ch = fgetc(fin);
}
x = 0;
while (isdigit(ch)) {
x = x * 10 + ch - '0';
ch = fgetc(fin);
}
return x;
}
int main()
{
FILE *fin, *fout;
int n, q, i, j, p, poz, nr;
fin = fopen("stramosi.in", "r");
n = readInt(fin);
q = readInt(fin);
for (i = 1; i <= n; i++) {
st[0][i] = readInt(fin);
}
j = 1;
p = 2;
while (p <= n) {
for (i = 1; i <= n; i++) {
st[j][i] = st[j - 1][st[j - 1][i]];//al p lea parinte al lui i este al p / 2 lea parinte al p / 2 parinte al lui i
}
j++;
p *= 2;
}
fout = fopen("stramosi.out", "w");
for (i = 0; i < q; i++) {
poz = readInt(fin);
nr = readInt(fin);
p = 1;
for (j = 0; j <= MAXL; j++) {
if ((nr & p) > 0) {//daca poz are puterea p in descompunerea in baza 2
poz = st[j][poz];
}
p *= 2;
}
fprintf(fout, "%d\n", poz);
}
fclose(fin);
fclose(fout);
return 0;
}