Pagini recente » Cod sursa (job #304209) | Cod sursa (job #3275809) | Cod sursa (job #749225) | Cod sursa (job #2513477) | Cod sursa (job #2514033)
#include <bits/stdc++.h>
#define NMAX 100005
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, m, nivel;
vector<int> v[NMAX];
int v4[NMAX];
vector<int> v2;
vector<int> v3;
int z[20][4*NMAX];
void dfs(int nod)
{
nivel++;
v2.push_back(nod);
v3.push_back(nivel);
v4[nod] = v2.size()-1;
for(auto i:v[nod])
{
dfs(i);
v3.push_back(nivel);
v2.push_back(nod);
}
nivel--;
}
int main()
{
fin>>n>>m;
int x;
for(int i=2; i<=n; i++)
{
fin>>x;
v[x].push_back(i);
}
dfs(1);
int k = v3.size();
for(int i=0; i<k; i++)
z[0][i] = i;
for(int j=1; (1<<j)<k; j++)
{
for(int i=0; i+(1<<(j-1))<k; i++)
{
z[j][i] = z[j-1][i+(1<<(j-1))];
if(v3[z[j-1][i]] < v3[z[j-1][i+(1<<(j-1))]])
z[j][i] = z[j-1][i];
}
}
int y;
int j = 0;
for(int i=0; i<m; i++)
{
fin>>x>>y;
x = v4[x];
y = v4[y];
if(x>y)
swap(x, y);
j=0;
while(x+(1<<j)-1<=y)
j++;
j--;
if(v3[z[j][x]]<=v3[z[j][y-(1<<j)+1]])
fout<<v2[z[j][x]]<<'\n';
else
fout<<v2[z[j][y-(1<<j)+1]]<<'\n';
}
return 0;
}