Pagini recente » Cod sursa (job #2479293) | Cod sursa (job #696632) | Borderou de evaluare (job #2830541) | Cod sursa (job #1397625) | Cod sursa (job #1211542)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
int n,m,i,j,x,y,k,lg,aux;
int p[200010],a[20][200010],f[100010],niv[100010];
vector <int> l[100010];
void dfs (int nod,int NIV) {
a[0][++k]=nod;
niv[nod]=NIV;
if (f[nod]==0)
f[nod]=k;
for (int i=0;i<l[nod].size();i++) {
dfs (l[nod][i],NIV+1);
a[0][++k]=nod;
}
}
int main () {
fin>>n>>m;
for (i=2;i<=n;i++) {
fin>>x;
l[x].push_back(i);
}
dfs (1,1);
for (i=2;i<=k;i++)
p[i]=p[i/2]+1;
for (i=1;(1<<i)<=k;i++)
for (j=1;j<=k;j++){
x = (((1<<(i-1))+j)<=k?((1<<(i-1))+j):j);
if (niv[a[i-1][j]]<niv[a[i-1][x]])
a[i][j]=a[i-1][j];
else
a[i][j]=a[i-1][x];
}
while (m--) {
fin>>x>>y;
x=f[x];y=f[y];
if (y<x) {
aux=x;
x=y;
y=aux;
}
lg=y-x+1;
if (niv[a[p[lg]][x]]<niv[a[p[lg]][y-(1<<p[lg])+1]])
fout<<a[p[lg]][x]<<"\n";
else
fout<<a[p[lg]][y-(1<<p[lg])+1]<<"\n";
}
return 0;
}