Pagini recente » Cod sursa (job #6462) | Cod sursa (job #2916794) | Cod sursa (job #49676) | Cod sursa (job #3145994) | Cod sursa (job #2514019)
#include <bits/stdc++.h>
#include <fstream>
#define NMAX 100005
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, m, r, nivel;
vector<int> v[NMAX];
int v4[NMAX];
vector<int> v2;
vector<int> v3;
pair<int, int> z[20][2*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);
for(int i=0; i<v3.size(); i++)
{
z[0][i].first = v3[i];
z[0][i].second = i;
// cout<<z[0][i].first<<' ';
}
for(int j=1; (1<<j)<=v3.size(); j++)
{
for(int i=0; i+(1<<(j-1))<v3.size(); i++)
{
if(z[j-1][i].first<=z[j-1][i+(1<<(j-1))].first){
z[j][i].first = z[j-1][i].first;
z[j][i].second = z[j-1][i].second;
}
else
{
z[j][i].first = z[j-1][i+(1<<(j-1))].first;
z[j][i].second = z[j-1][i+(1<<(j-1))].second;
}
}
}
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];
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].second]<<'\n';
else
fout<<v2[z[j][y-(1<<j)+1].second]<<'\n';
}
return 0;
}