Pagini recente » Cod sursa (job #2415741) | Cod sursa (job #2964820) | Cod sursa (job #1571301) | Cod sursa (job #1195468) | Cod sursa (job #2514030)
#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++;
for(auto i:v[nod])
{
v2.push_back(nod);
v3.push_back(nivel);
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(v2[z[j-1][i]] < v2[z[j-1][i+(1<<(j-1))]])
z[j][i] = z[j-1][i];
}
}
int y;
for(int i=0; i<v2.size(); i++)
{
v4[v2[i]] = i;
}
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(z[j][x]<=z[j][y-(1<<j)+1])
fout<<v2[z[j][x]]<<'\n';
else
fout<<v2[z[j][y-(1<<j)+1]]<<'\n';
}
return 0;
}