Pagini recente » Cod sursa (job #2824477) | Cod sursa (job #200704) | Cod sursa (job #242221) | Cod sursa (job #1628428) | Cod sursa (job #2886969)
#include <iostream>
#include <vector>
#define MAXN 100000
#define MAX_LOG 19
using namespace std;
struct node{
int lvl;
vector <int> children;
};
struct elem{
int val;
int pos;
};
node tree[MAXN + 1];
int lvl[MAXN + 1];
int firstApp[MAXN + 1];
int euler[MAXN * 2];
int eulerSize;
int logg[MAXN * 2];
int rmq[MAXN * 2][MAX_LOG];
void dfs(int pos, int level) {
firstApp[pos] = eulerSize;
euler[eulerSize] = pos;
lvl[pos] = level;
eulerSize++;
for ( int i : tree[pos].children ) {
dfs(i, level + 1);
euler[eulerSize] = pos;
eulerSize++;
}
}
void precalcLog(int n) {
int i;
for ( i = 2; i <= n; i++ ) {
logg[i] = logg[i / 2] + 1;
}
}
void buildRmq(int n) {
int i, i2;
for ( i = 1; i <= n; i++ ) {
rmq[i][0] = euler[i];
}
for ( i = 1; i <= logg[n]; i++ ) {
for ( i2 = 1; i2 + (1 << i) - 1 <= n; i2++ ) {
if ( lvl[rmq[i2][i - 1]] < lvl[rmq[i2 + (1 << (i - 1))][i - 1]] ) {
rmq[i2][i] = rmq[i2][i - 1];
} else {
rmq[i2][i] = rmq[i2 + (1 << (i - 1))][i - 1];
}
}
}
}
int query(int a, int b) {
int st, dr, lenght;
st = firstApp[a];
dr = firstApp[b];
if ( st > dr )
swap(st, dr);
lenght = dr - st + 1;
if ( lvl[rmq[st][logg[lenght]]] < lvl[rmq[dr - (1 << logg[lenght]) + 1][logg[lenght]]] )
return rmq[st][logg[lenght]];
return rmq[dr - (1 << logg[lenght]) + 1][logg[lenght]];
}
int main() {
FILE *fin, *fout;
fin = fopen("lca.in", "r");
fout = fopen("lca.out", "w");
int n, t, i, a, b;
fscanf(fin, "%d%d", &n, &t);
for ( i = 2; i <= n; i++ ) {
fscanf(fin, "%d", &a);
tree[a].children.push_back(i);
}
eulerSize = 1;
dfs(1, 0);
eulerSize--;
precalcLog(eulerSize);
buildRmq(eulerSize);
while ( t-- ) {
fscanf(fin, "%d%d", &a, &b);
fprintf(fout, "%d\n", query(a, b));
}
fclose(fin);
fclose(fout);
return 0;
}