Pagini recente » Cod sursa (job #3004925) | Cod sursa (job #2757992) | Cod sursa (job #490748) | Cod sursa (job #1327761) | Cod sursa (job #2565381)
#include <fstream>
#include <vector>
#define N 100002
#define INF 2000000000
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector <int> arb[N];
int first[N],niv[N],nr;
int rmq[17][4*N],log[4*N];
void e(int nod, int pr)
{
rmq[0][++nr]=nod;
first[nod]= nr;
for(int i=0;i<arb[nod].size();++i)
{
int vee=arb[nod][i];
if(vee!=pr)
{
niv[vee]=niv[nod]+1;
e(vee,nod);
rmq[0][++nr]=nod;
}
}
}
int main()
{
int n,m,x,rad=1;
f>>n>>m;
for(int i=2;i<=n;++i)
{
f>>x;
arb[x].push_back(i);
}
for(int i=1;i<=n;++i) niv[i]=INF;
niv[1]=0;
e(1,1);
log[0]=-1;
for(int i=1;i<=nr;++i) log[i]=1+log[i/2];
int p=1;
for(int i=1;i<=log[nr];++i)
{
for(int j=1;j+p<=nr;++j)
if(niv[rmq[i-1][j]]<niv[rmq[i-1][j+p]])
rmq[i][j]=rmq[i-1][j];
else
rmq[i][j]=rmq[i-1][j+p];
p*=2;
}
int a,b,dif,lin,sol;
while(m--)
{
f>>a>>b;
a=first[a];
b=first[b];
if(a>b) swap(a,b);
dif=b-a+1;
lin=log[dif];
p=(1<<lin);
if(niv[rmq[lin][a]]<niv[rmq[lin][b-p+1]])
sol=rmq[lin][a];
else
sol=rmq[lin][b-p+1];
g<<sol<<'\n';
}
f.close();
g.close();
return 0;
}