Pagini recente » Cod sursa (job #842885) | Cod sursa (job #2332614) | Cod sursa (job #2149590) | Cod sursa (job #2968802) | Cod sursa (job #2948056)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
vector <int> g[100005];
int e[200005],s,d[100005],f[100005],lg[100005],i,j,k;
int n,m;
int rmq[100005][20];
void dfs (int n,int l)
{
e[++s] = n;
d[s] = l;
f[n] = s;
for (auto next1 : g[n])
{
dfs(next1,l+1);
e[++s] = n;
d[s] = l;
}
}
void build1 ()
{
int i,j;
for (i=2;i<=s;i++)
lg[i] = lg[i/2] + 1;
for (i=1;i<=s;i++)
rmq[i][0] = i;
for (j=1;j<=lg[s];j++)
for (i=1;i+(1<<j)-1 <= s;i++)
if (d[rmq[i][j-1]] < d[rmq[i+(1<<(j-1))][j-1]])
rmq[i][j] = rmq[i][j-1];
else
rmq[i][j] = rmq[i+(1<<(j-1))][j-1];
}
int lca (int x,int y)
{
int answ;
int dist,p;
x = f[x];
y = f[y];
if (x > y)
swap(x,y);
dist = y - x + 1;
p = lg[dist];
//d[rmq[i][j-1]];
int f1 = rmq[x][p];
int f2 = rmq[y - (1<<p) + 1][p];
if (d[f1] < d[f2])
answ = f1;
else
answ = f2;
return e[answ];
}
int main()
{
ios::sync_with_stdio(false);
fin.tie(0);
fout.tie(0);
fin >> n >> m;
for (i=2;i<=n;i++)
{
fin >> k;
g[k].push_back(i);
}
dfs(1,0);
build1();
for (i=1;i<=m;i++)
{
int l,r;
fin >> l >> r;
fout << lca(l,r) << '\n';
}
return 0;
}