Pagini recente » Cod sursa (job #2234119) | Diferente pentru implica-te/arhiva-educationala intre reviziile 42 si 43 | Cod sursa (job #291612) | Cod sursa (job #1711026) | Cod sursa (job #1512407)
#include <bits/stdc++.h>
using namespace std;
int t[100005], n;
vector<int> L[100005];
int drum[100005][20];
bool viz[100005];
int start;
FILE *g = fopen("lca.out", "w");
void dfs(int where, int level) {
for(int i = 0; i < L[where].size(); i ++) {
for(int j = 0; j <= drum[where][0]; j ++)
drum[L[where][i]][j] = drum[where][j];
drum[L[where][i]][level] = i;
drum[L[where][i]][0] = level;
dfs(L[where][i], level + 1);
}
}
int lca(int x, int y) {
int poz = start;
int lim = min(drum[x][0], drum[y][0]);
for(int i = 1; i <= lim && drum[x][i] == drum[y][i]; i ++) {
poz = L[poz][drum[x][i]];
}
return poz;
}
int main()
{
FILE *f = fopen("lca.in", "r");
int m, x, y;
fscanf(f, "%d %d", &n, &m);
for(int i = 2; i <= n; i ++) {
fscanf(f, "%d", &t[i]);
viz[i] = true;
L[t[i]].push_back(i);
}
for(int i = 1; i <= n; i ++) {
if(!viz[i])
start = i;
}
drum[start][0] = 0;
dfs(start, 1);
for(int i = 1; i <= m; i ++) {
fscanf(f, "%d %d", &x, &y);
fprintf(g, "%d\n", lca(x, y));
}
return 0;
}