Pagini recente » Rating Brihacescu Toma (TomaInfo) | Cod sursa (job #1251752) | Cod sursa (job #2146792) | Cod sursa (job #773896) | Cod sursa (job #1804146)
#include <iostream>
#include<fstream>
#include<vector>
using namespace std;
const int nmax=100005;
vector<int> v[nmax];
int rmq[20][2*nmax],first[nmax],lev[nmax],lg[2*nmax];
int unu,doi,n,m,i,j,x,y,a,b,k,niv,dif;
void dfs(int x)
{
k++;
first[x]=k;
rmq[0][k]=x;
for(int i=0;i<v[x].size();i++)
{
lev[v[x][i]]=lev[x]+1;
dfs(v[x][i]);
k++;rmq[0][k]=x;
}
}
void build_rmq()
{
for(i=2;i<=k;i++)
lg[i]=lg[i/2]+1;
for(i=1;(1<<i)<=k;i++)
for(j=1;j<=k-(1<<i)+1;j++)
{
if(lev[rmq[i-1][j]]<lev[rmq[i-1][j+(1<<(i-1))]]) rmq[i][j]=rmq[i-1][j];
else rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
}
}
int lca()
{
unu=first[a];
doi=first[b];
if(unu>doi) swap(unu,doi);
niv=lg[doi-unu+1];
dif=doi-unu+1-(1<<niv);
if(lev[rmq[niv][unu]]<lev[rmq[niv][unu+dif]]) return rmq[niv][unu];
return rmq[niv][unu+dif];
}
int main()
{
ifstream f("lca.in");
ofstream g("lca.out");
f>>n>>m;
for(i=2;i<=n;i++)
{
f>>x;v[x].push_back(i);
}
dfs(1);
build_rmq();
for(i=1;i<=m;i++)
{
f>>a>>b;
g<<lca()<<'\n';
}
return 0;
}