Pagini recente » Cod sursa (job #2861933) | Cod sursa (job #285255) | Cod sursa (job #2921877) | Cod sursa (job #1266507) | Cod sursa (job #1896518)
#include <fstream>
#include <vector>
using namespace std;
#define MAX_N 100005
#define MAX_L 20
#define foreach(V)
ifstream fin ("lca.in");
ofstream fout ("lca.out");
int n, m, t[MAX_L][MAX_N], lg[MAX_N], lv[MAX_N];
vector <int> g[MAX_N];
void dfs(int nod, int lev)
{
lv[nod] = lev;
for(typeof (g[nod]).begin() it = (g[nod]).begin(); it != (g[nod]).end(); it++)
dfs(*it, lev+1);
}
int lca(int x, int y)
{
if(lv[x] < lv[y])
swap(x, y);
int log1 = 1, log2 = 1;
while((1 << log1) < lv[x]) log1++;
while((1 << log2) < lv[y]) log2++;
for(int k = log1; k >= 0; k--)
if(lv[x] - (1 << k) >= lv[y])
x = t[k][x];
if(x == y) return x;
for(int k = log2; k >= 0; k--)
if(t[k][x] && t[k][x] != t[k][y])x = t[k][x],y = t[k][y];
return t[0][x];
}
int main()
{
fin >> n >> m;
for(int i = 2; i <= n; ++i)
{
fin >> t[0][i];
g[t[0][i]].push_back(i);
}
for(int k = 1; (1 << k) <= n; k++)
for(int i = 1; i <= n; i++)
t[k][i] = t[k-1][t[k-1][i]];
dfs(1, 0);
int x, y;
for (int i = 1; i <= m; i ++)
{
fin >> x >> y;
fout << lca(x, y) << "\n";
}
}