Pagini recente » Cod sursa (job #2981090) | Cod sursa (job #290503) | Cod sursa (job #3146831) | Cod sursa (job #1933415) | Cod sursa (job #3226844)
#include <fstream>
#include <vector>
#define NMAX 100005
#define LOG_MAX 17
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
int table[NMAX][LOG_MAX], nivel[NMAX];
int f[NMAX];
vector <int> adj[NMAX];
void dfs(int node)
{
for (int i = 0; i < adj[node].size(); ++i)
{
int vecin = adj[node][i];
if (nivel[vecin] == 0 && vecin != 1)
{
nivel[vecin] = nivel[node] + 1;
dfs(vecin);
}
}
}
int main()
{
int n, m, i, j, a, x, y, log;
in >> n >> m;
for (i = 2; i <= n; ++i)
{
in >> table[i][0];
adj[i].push_back(table[i][0]);
adj[table[i][0]].push_back(i);
}
dfs(1);
/*for (i = 1; i <= n; ++i)
out << nivel[i] << " ";*/
for (log = 1; log < LOG_MAX; ++log)
for (i = 2; i <= n; ++i)
table[i][log] = table[table[i][log - 1]][log - 1];
/*for (i = 1; i <= n; ++i)
{
for (log = 0; log < LOG_MAX; ++log)
out << table[i][log] << " ";
out << '\n';
}*/
for (i = 1; i <= m; ++i)
{
in >> x >> y;
if (nivel[x] > nivel[y])
swap(x, y);
log = LOG_MAX - 1;
while (nivel[x] < nivel[y])
{
if (nivel[x] <= nivel[table[y][log]])
y = table[y][log];
log--;
}
if (x != y)
{
log = LOG_MAX - 1;
while (table[x][0] != table[y][0])
{
if (table[x][log] != table[y][log])
{
x = table[x][log];
y = table[y][log];
}
log--;
}
out << table[x][0] << '\n';
}
else
out << x << '\n';
}
return 0;
}