Pagini recente » Cod sursa (job #2180596) | Cod sursa (job #965609) | Cod sursa (job #3158648) | Cod sursa (job #2373279) | Cod sursa (job #3003361)
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int nmax = 100000;
vector<int>g[nmax + 1];
int nivel[nmax + 1];
int poz[nmax + 1];
int dp[18][2 * nmax + 1];
vector<int>v;
int n,m;
int var = 0;
void dfs(int node, int lvl)
{
v.push_back(node);
var++;
poz[node] = var;
nivel[node] = lvl;
lvl++;
for(int i = 0; i < g[node].size(); i++)
{
if(nivel[g[node][i]] == 0)
{
dfs(g[node][i],lvl);
var++;
}
v.push_back(node);
poz[node] = var;
}
}
void build_rmq()
{
for(int i = 0; i < v.size(); i++)
dp[0][i] = v[i];
int l = log2(v.size());
int l2 = v.size();
for(int i = 1; i <= l; i++)
for(int j = 1; j <= l2; j++)
{
if(nivel[dp[i - 1][j]] < nivel[dp[i - 1][j + (1<<(i - 1))]])
dp[i][j] = dp[i - 1][j];
else
dp[i][j] = dp[i - 1][j + (1<<(i - 1))];
}
}
void find_ancestor(int x, int y)
{
int lastx = poz[x] - 1;
int lasty = poz[y] - 1;
if(lastx > lasty)
swap(lastx, lasty);
int length = lasty - lastx + 1;
int exp = log2(length);
int lint1 = (1<<exp);
int cmp = dp[exp][lastx];
int cmp2 = dp[exp][lasty - lint1 + 1];
int finali = 1e9;
if(nivel[cmp] < finali)
finali = cmp;
if(nivel[cmp2] < finali)
finali = cmp2;
out<<finali<<'\n';
}
int main()
{
in>>n>>m;
for(int i = 1; i <= n - 1; i++)
{
int x;
in>>x;
g[x].push_back(i + 1);
}
dfs(1,1);
build_rmq();
for(int i = 1; i <= m ; i++)
{
int x,y;
in>>x>>y;
find_ancestor(x,y);
}
return 0;
}