Pagini recente » Cod sursa (job #1503274) | Cod sursa (job #59081) | Cod sursa (job #816017) | Cod sursa (job #3127154) | Cod sursa (job #2165143)
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#define Nmax 100001
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> v[Nmax];
int dfp[2*Nmax],niv[2*Nmax],m[Nmax][21],k,poz[Nmax];
void df(int x,int lev)
{
niv[++k]=lev;
dfp[k]=x;
//if(poz[x]==0) poz[x]=k;
int i;
for(i=0;i<v[x].size();i++)
if(!poz[v[x][i]])
{
poz[v[x][i]]=k+1;
df(v[x][i],lev+1);
niv[++k]=lev;
dfp[k]=x;
}
}
int main()
{
int q,i,j,x,y,n;
f>>n>>q;
for(i=1;i<n;i++)
{
f>>x;
v[x].push_back(i+1);
v[i+1].push_back(x);
}
poz[1]=1;
df(1,0);
for(i=1;i<=k;i++)
m[i][0]=i;
for(j=1;(1<<j)<=k;j++)
for(i=1;i+(1<<j)-1<=k;i++)
{
if(niv[m[i][j-1]]>niv[m[i+(1<<(j-1))][j-1]]) m[i][j]=m[i+(1<<(j-1))][j-1];
else m[i][j]=m[i][j-1];
}
int l;
for(i=1;i<=q;i++)
{
f>>x>>y;
x=poz[x];
y=poz[y];
if(x>y) {l=x;x=y;y=l;}
//cout<<x<<" "<<y<<'\n';
l=log2(y-x+1);
if(niv[m[x][l]]<=niv[m[y-(1<<l)+1][l]])g<<dfp[m[x][l]]<<'\n';
else g<<dfp[m[y-(1<<l)+1][l]]<<'\n';
}
return 0;
}