Pagini recente » Cod sursa (job #1361318) | Cod sursa (job #1208698) | Cod sursa (job #2068853) | Cod sursa (job #373380) | Cod sursa (job #1772789)
# include <fstream>
# include <vector>
# define DIM 100010
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector <int> Lista[DIM];
int m[19][DIM*2],p2[20],Marcat[DIM],niv[DIM],p[DIM*2],rp[DIM*2],pi[2*DIM];
int n,m1,s,i,j,x,y,d,st,dr,vst,vdr,val,l,aux;
void dfs(int nc,int nivc){
niv[nc]=nivc;
s++;
Marcat[nc]=s;
p[s]=nivc;
rp[s]=nc;
for(int i=0;i<Lista[nc].size();i++){
int nv=Lista[nc][i];
if(!Marcat[nv]){
dfs(nv,nivc+1);
s++;
p[s]=nivc;
rp[s]=nc;
}
}
}
int main () {
fin>>n>>m1;
for(i=1;i<n;i++){
fin>>x;
Lista[x].push_back(i+1);
}
dfs(1,0);
p2[0]=1;
for(i=1;2*p2[i-1]<=s;i++)
p2[i]=2*p2[i-1];
d=i-1;
for(i=2;i<=s;i++)
pi[i]=pi[i/2]+1;
for(i=1;i<=s;i++)
m[0][i]=rp[i];
for(i=1;i<=d;i++)
for(j=1;j<=s-p2[i]+1;j++){
st=j;
dr=j+p2[i-1];
vst=m[i-1][st];
vdr=m[i-1][dr];
if(niv[vst]<niv[vdr])
m[i][j]=vst;
else
m[i][j]=vdr;
}
for(i=1;i<=m1;i++){
fin>>x>>y;
st=Marcat[x];
dr=Marcat[y];
if(st>dr){
aux=st;
st=dr;
dr=aux;
}
l=dr-st+1;
val=pi[l];
vst=m[val][st];
vdr=m[val][dr-p2[val]+1];
if(niv[vst]<niv[vdr])
fout<<vst<<"\n";
else
fout<<vdr<<"\n";
}
return 0;
}