Pagini recente » Cod sursa (job #2854128) | Cod sursa (job #1881290) | Cod sursa (job #1441776) | Cod sursa (job #1699321) | Cod sursa (job #2934766)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
const int MAXN=1000010;
const int LGMAX=20;
int tati[MAXN],n,q,ti[MAXN],te[MAXN],timp,visit[MAXN],depth[MAXN];
vector <int> g[MAXN];
int tati2[LGMAX][MAXN];
void dfs (int nod, int d){
if (visit[nod]==1)
return;
depth[nod]=d;
visit[nod]=1;
ti[nod]=++timp;
for (int i=0;i<g[nod].size ();++i)
dfs (g[nod][i],d+1);
te[nod]=++timp;
}
int main()
{
fin >>n>>q;
for (int i=2;i<=n;++i){
fin >>tati[i];
g[tati[i]].push_back (i);
g[i].push_back (tati[i]);
}
dfs (1,0);
/*for (int i=1;i<=n;++i)
fout <<ti[i]<<' '<<te[i]<<'\n';*/
for (int i=1;i<=n;++i)
tati2[0][i]=tati[i];
for (int i=1;i<LGMAX;++i){
for (int j=1;j<=n;++j){
tati2[i][j]=tati2[i-1][tati2[i-1][j]];
}
}
//for (int i=1;i<=n;++i)
// fout <<depth[i]<<' ';
for (int i=1;i<=q;++i){
int x,y;
fin >>x>>y;
if (depth[y]<depth[x])
swap (x,y);
if (ti[x]<=ti[y] and te[x]>=te[y]){
fout <<x<<'\n';
continue;
}
int p=0;
while ((1<<p)<=depth[x])
p++;
p--;
while (p>-1){
int tata=tati2[p][x];
if (tata==0)
tata=1;
if (ti[tata]>ti[y] or te[tata]<te[y]){
x=tata;
}
p--;
}
fout <<tati[x]<<'\n';
}
fin.close ();
fout.close ();
return 0;
}