Pagini recente » Cod sursa (job #2039043) | Cod sursa (job #861545) | Cod sursa (job #194918) | Cod sursa (job #1488690) | Cod sursa (job #2054594)
# 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],lg[DIM],p[20],n,q,i,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=0,step=1;i<20;step*=2,i++)
p[i]=step;
for(i=2;i<=DIM-5;i++)
lg[i]=lg[i/2]+1;
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(i=1;i<=q;i++){
fin>>x>>y;
if(niv[y]<niv[x])
swap(x,y);
if(niv[x]!=niv[y])
for(step=p[lg[niv[y]]-lg[niv[x]]],j=lg[niv[y]-niv[x]];step;step/=2,j--)
if(niv[y]-step>=niv[x])
y=v[j][y];
if(x==y){
fout<<x<<"\n";
continue;
}
for(step=p[lg[niv[x]]],j=lg[niv[x]];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;
}