Pagini recente » Cod sursa (job #2042717) | Cod sursa (job #1246209) | Cod sursa (job #3225618) | Cod sursa (job #1994965) | Cod sursa (job #2285335)
#include<stdio.h>
void read(FILE *in, int t[], int p[], int l[], int n)
{
int i, s = sqrt(n);
l[1] = 0; p[1] = 1; t[1] = 0;
for(i = 2; i <= n; i ++) {
fscanf(in, "%d", &t[i]);
l[i] = l[t[i]] + 1;
if(l[i] < s) {
p[i] = 1;
}
else {
if(l[i]%s == 0) {
p[i] = t[i];
}
else {
p[i] = p[t[i]];
}
}
}
}
int query(FILE *in, int t[], int p[], int l[])
{
int x, y;
fscanf(in, "%d %d", &x, &y);
while(p[x] != p[y]) {
if(l[x] > l[y]) {
x = p[x];
}
else {
y = p[y];
}
}
while(x != y) {
if(l[x] > l[y]) {
x = t[x];
}
else {
y = t[y];
}
}
return x;
}
int main ()
{
FILE *in, *out;
in = fopen("lca.in", "r");
out = fopen("lca.out", "w");
int n, m;
fscanf(in, "%d %d", &n, &m);
int t[n+1], p[n+1], l[n+1];
read(in, t, p, l, n);
while (m) {
fprintf(out, "%d\n", query(in, t, p, l));
m --;
}
fclose(in);
fclose(out);
return 0;
}