Pagini recente » Diferente pentru utilizator/stay_awake77 intre reviziile 51 si 21 | Istoria paginii utilizator/bricolone | Profil Andrei.ghiu | Diferente pentru probleme-de-taietura intre reviziile 46 si 96 | Cod sursa (job #774254)
Cod sursa(job #774254)
#include <stdio.h>
#include <algorithm>
#include <vector>
#define MAXN 250001
#define MAXLN 18
using namespace std;
int stramosi[MAXN][MAXLN];
//stramosi[i][j] = (2^j) a lui i
/*
1025 x
1 tz
*/
int find(int cnt, int x) {
fprintf(stderr, "Finding %d %d\n", x, cnt);
int poz = 1;
if (x == 0) return 0;
int pow = 0;
while (poz < cnt) {
poz = poz << 1;
pow ++;
}
if (poz == cnt) {
return stramosi[x][pow];
}
return find(cnt - (poz >> 1), stramosi[x][pow - 1]);
}
int main() {
FILE *f = fopen("stramosi.in", "r");
FILE *g = fopen("stramosi.out", "w");
int n, m;
vector<int> tati;
tati.push_back(0);
fscanf(f, "%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
int x;
fscanf(f, "%d", &x);
tati.push_back(x);
stramosi[i][0] = x;
}
for (int i = 0; i <= n; i++) {
for (int j = 0; j < MAXLN; j++) {
fprintf(stderr, "%d ", stramosi[i][j]);
}
fprintf(stderr, "\n");
}
fprintf(stderr, "\n");
for (int j = 1; j < MAXLN; j++) {
for (int i = 1; i <= n; i++) {
stramosi[i][j] = stramosi[stramosi[i][j - 1]][j - 1];
}
}
for (int i = 0; i <= n; i++) {
for (int j = 0; j < MAXLN; j++) {
fprintf(stderr, "%d ", stramosi[i][j]);
}
fprintf(stderr, "\n");
}
for (int i = 0; i < m; i++) {
int x, cnt;
fscanf(f, "%d%d", &x, &cnt);
fprintf(g, "%d\n", find(cnt, x));
}
fclose(f);
fclose(g);
}