Pagini recente » Cod sursa (job #2282990) | Cod sursa (job #446539) | Cod sursa (job #869629) | Cod sursa (job #1591632) | Cod sursa (job #191715)
Cod sursa(job #191715)
#include <stdio.h>
#include <stdlib.h>
typedef unsigned char byte;
typedef struct list {
int node;
byte level;
};
FILE *fin, *fout;
int n, numTests;
// a[n][k] = the node 2^k levels above n.
int a[250010][20];
list unknown[5000000];
int numUnknown;
void read() {
fscanf(fin, "%d %d", &n, &numTests);
for (int i = 1; i <= n; i++) {
fscanf(fin, "%d", &a[i][0]);
for (int j = 1; j < 20; j++) {
a[i][j] = -1;
}
}
numUnknown = 0;
}
inline void enqueue(int node, int level) {
unknown[numUnknown].node = node;
unknown[numUnknown++].level = level;
}
inline void dequeue() {
numUnknown--;
}
void lazyEval(int node, int level) {
if (a[node][level] != -1) {
return;
}
enqueue(node, level);
while (numUnknown) {
int uNode = unknown[numUnknown - 1].node;
int uLevel = unknown[numUnknown - 1].level;
int halfway = a[uNode][uLevel - 1];
if (halfway == -1) {
enqueue(uNode, uLevel -1);
} else {
int top = a[halfway][uLevel - 1];
if (top == -1) {
enqueue(halfway, uLevel -1);
} else {
a[uNode][uLevel] = top;
dequeue();
}
}
}
}
int query(int node, int level) {
int log = 0;
while (level && node) {
if (level % 2) {
lazyEval(node, log);
node = a[node][log];
}
log++;
level >>= 1;
}
return node;
}
int main() {
fin = fopen("stramosi.in", "rt");
fout = fopen("stramosi.out", "wt");
read();
for (int test = 0; test < numTests; test++) {
int node, level;
fscanf(fin, "%d %d", &node, &level);
fprintf(fout, "%d\n", query(node, level));
}
fclose(fin);
fclose(fout);
return 0;
}