Pagini recente » Cod sursa (job #1411012) | Cod sursa (job #1146726) | Cod sursa (job #391404) | Cod sursa (job #913910) | Cod sursa (job #1210110)
#include <fstream>
#include <vector>
#define DIM 100011
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,m,T[DIM],a[21][DIM],nr,F[DIM],p[DIM];
pair<int,int> E[2*DIM];
vector<int> L[DIM];
vector<int>::iterator it;
void dfs(int nod,int niv){
E[++nr]=make_pair(nod,niv);
if(!F[nod]) F[nod]=nr;
for(register int i=0;i<L[nod].size();i++){
dfs(L[nod][i],niv+1);
E[++nr]=make_pair(nod,niv);
}
}
int main(void){
register int i,b,j,jv,x,y;
f>>n>>m;
for(i=2;i<=n;i++)
f>>T[i], L[T[i]].push_back(i);
dfs(1,1);
a[0][1]=1;
for(i=2;i<=nr;i++) p[i]=1+p[i/2],a[0][i]=i;
for(i=1;(1<<i)<=nr;i++){
for(j=1;j<=nr;j++){
a[i][j]=a[i-1][j];
jv=(1<<(i-1))+j;
if(jv<=nr && E[a[i-1][jv]].second<=E[a[i][j]].second)
a[i][j]=a[i-1][jv];
}
}
for(i=1;i<=m;i++){
f>>x>>y;
x=F[x],y=F[y];
if(x>y) jv=x,x=y,y=jv;
b=p[y-x+1];
jv=y-(1<<b)+1;
if(E[a[b][x]].second<=E[a[b][jv]].second)
g<<E[a[b][x]].first;
else g<<E[a[b][jv]].second;
g<<"\n";
}
f.close();
g.close();
return 0;
}