Pagini recente » Cod sursa (job #1304290) | Cod sursa (job #2552869) | Cod sursa (job #2131012) | Cod sursa (job #1819482) | Cod sursa (job #1992005)
#include <bits/stdc++.h>
#define Nmax 100001
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
list <int> arb[Nmax];
int elr[Nmax];
int lvl[Nmax];
int pz[Nmax];
int pp,N;
void DFS(int x, int lv)
{
elr[++N]=x;
lvl[x]=lv;
if(!pz[x]) pz[x]=N;
for(list <int> :: iterator it=arb[x].begin();it!=arb[x].end();it++)
{
DFS(*it,lv+1);
elr[++N]=x;
}
}
int logg2(int n)
{
pp=1;
int nr=0;
while(pp<=n)
{
nr++;
pp*=2;
}
if(pp>n) pp/=2;
return nr-1;
}
int main()
{
int n,m,i,x,y,j,p,q,k,nr;
f>>n>>m;
for(i=2;i<=n;i++)
{
f>>x;
arb[x].push_back(i);
}
DFS(1,0);
N=*max_element(pz+1,pz+n+1);
nr=logg2(N);
pp=1;
int D[nr][N];
for(i=1;i<=N;i++)
D[0][i]=elr[i];
for(i=1;i<=nr;i++)
{
pp*=2;
for(j=1;j+pp<=N;j++)
{
D[i][j]=D[i-1][j];
if(lvl[D[i-1][j+pp/2]]<lvl[D[i-1][j]])
D[i][j]=D[i-1][j+pp/2];
}
}
int ans;
for(j=1;j<=m;j++)
{
f>>x>>y;
p=pz[x];
q=pz[y];
if(q<p) swap(p,q);
k=logg2(q-p);
ans=D[k][p];
if(lvl[ans]>lvl[D[k][y-pp+1]])
ans=D[k][y-pp+1];
g<<ans<<'\n';
}
return 0;
}