Pagini recente » Cod sursa (job #2058974) | Cod sursa (job #2050966) | Cod sursa (job #1590417) | Cod sursa (job #2110341) | Cod sursa (job #2054575)
# include <fstream>
# include <vector>
# define DIM 100010
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int> Lista[DIM];
int v[20][DIM],niv[DIM],n,q,i,j,step,J,Step,x,y;
void dfs(int nc,int pas){
niv[nc]=pas;
for(int i=0;i<Lista[nc].size();i++){
int nv=Lista[nc][i];
if(!niv[nv])
dfs(nv,pas+1);
}
}
int main () {
fin>>n>>q;
for(i=2;i<=n;i++){
fin>>v[0][i];
Lista[v[0][i]].push_back(i);
}
for(step=2,j=1;step<=n;step*=2,j++)
for(i=1;i<=n;i++)
v[j][i]=v[j-1][v[j-1][i]];
dfs(1,1);
for(Step=1,J=0;Step<=n;Step*=2,J++);
for(i=1;i<=q;i++){
fin>>x>>y;
if(niv[y]<niv[x])
swap(x,y);
if(niv[x]!=niv[y])
for(step=Step,j=J;step;step/=2,j--)
if(niv[y]-step>=niv[x])
y=v[j][y];
if(x==y){
fout<<x<<"\n";
continue;
}
for(step=Step,j=J;step;step/=2,j--)
if(v[j][x]!=v[j][y]){
x=v[j][x];
y=v[j][y];
}
fout<<v[0][x]<<"\n";
}
return 0;
}