Pagini recente » Cod sursa (job #2086926) | Cod sursa (job #2343550) | Cod sursa (job #818456) | Cod sursa (job #1558577) | Cod sursa (job #1930185)
#include <stdio.h>
#include <ctype.h>
#define MAX_N 100000
#define MAX_LOG 16
typedef struct {
int v, next;
} list;
int N, M, tmp;
int time, buff;
int h[MAX_N + 1];
int adj[MAX_N + 1];
list l[MAX_N];
int rmq[MAX_LOG + 1][(MAX_N << 1) + 1];
int lg[(MAX_N << 1) + 1];
int ptr[MAX_N + 1];
#define MAX_BUFF 65536
int pos = MAX_BUFF;
char in[MAX_BUFF];
char getChar(FILE *f) {
if (pos == MAX_BUFF) {
fread(in, 1, MAX_BUFF, f);
pos = 0;
}
return in[pos++];
}
int freef(FILE *f) {
int result = 0;
char c;
do {
c = getChar(f);
} while (!isdigit(c));
do {
result = (result << 3) + (result << 1) + c - '0';
c = getChar(f);
} while (isdigit(c));
return result;
}
void addEdge(int u, int v) {
buff++;
l[buff].next = adj[u];
l[buff].v = v;
adj[u] = buff;
}
void dfs(int u) {
int pos, v;
for (pos = adj[u]; pos; pos = l[pos].next) {
v = l[pos].v;
rmq[0][++time] = u;
ptr[u] = time;
h[v] = h[u] + 1;
dfs(v);
}
if (adj[u] == 0) {
rmq[0][++time] = u;
ptr[u] = time;
}
}
int get(int u, int v) {
if (ptr[v] < ptr[u]) {
tmp = u;
u = v;
v = tmp;
}
tmp = lg[ptr[v] - ptr[u]];
if (h[rmq[tmp][ptr[u]]] < h[rmq[tmp][ptr[v] - (1 << tmp) + 1]]) {
return rmq[tmp][ptr[u]];
}
return rmq[tmp][ptr[v] - (1 << tmp) + 1];
}
int main(void) {
int u, v, i;
FILE *f = fopen("lca.in", "r");
N = freef(f);
M = freef(f);
for (u = 2; u <= N; u++) {
addEdge(freef(f), u);
}
dfs(1);
lg[1] = 0;
for (i = 2; i <= time; i++) {
lg[i] = lg[i >> 1] + 1;
}
for (i = 1; i <= MAX_LOG; i++) {
tmp = time - (1 << (i - 1));
for (u = 1; u <= tmp; u++) {
if (h[rmq[i - 1][u]] < h[rmq[i - 1][u + (1 << (i - 1))]]) {
rmq[i][u] = rmq[i - 1][u];
} else {
rmq[i][u] = rmq[i - 1][u + (1 << (i - 1))];
}
}
}
freopen("lca.out", "w", stdout);
while (M) {
fprintf(stdout, "%d\n", get(freef(f), freef(f)));
M--;
}
fclose(f);
fclose(stdout);
return 0;
}