Pagini recente » Cod sursa (job #3283033) | Cod sursa (job #2682846) | Cod sursa (job #2089020) | Cod sursa (job #238054) | Cod sursa (job #1045628)
//nu ii frumos sa te uiti pe sursele altora:))...hotule....nu o sti face singur?:))
#include <cmath>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
#define MAX 100010
vector <int> G[MAX];
int a[2*MAX], k, minim[2*MAX][20];
int fr[MAX],lvl[MAX];
void insert(int s)
{
a[++k]=s;
}
void put(int s)
{
int i;
insert(s);
for(i=0;i<G[s].size();i++)
{
put(G[s][i]);
insert(s);
}
}
void DF(int nod, int nivel)
{
lvl[nod]=nivel;
for(int i=0;i<G[nod].size();i++)
{
DF(G[nod][i], nivel+1);
}
}
int main()
{
int n, m, x, i, j, y;
fin>>n;
fin>>m;
for(i=2;i<=n;i++)
{
fin>>x;
G[x].push_back(i);
}
put(1);
for(i=1;i<=k;i++)
{
if(!fr[a[i]])
fr[a[i]]=i;
}
DF(1, 0);
for(i=1;i<=k;i++)
minim[i][0]=a[i];
for(j=1;(1<<j)<=k;j++)
{
for(i=1;i+(1<<(j-1))<=k;i++)
{
//minim[i][j]=min(minim[i][j-1], minim[i+(1<<(j-1))][j-1]);
if(lvl[minim[i][j-1]]<=lvl[minim[i+(1<<(j-1))][j-1]])
minim[i][j]=minim[i][j-1];
else
minim[i][j]=minim[i+(1<<(j-1))][j-1];
}
}
for(i=1;i<=m;i++)
{
fin>>x>>y;
x=fr[x];
y=fr[y];
if(y<x)
swap(x,y);
k=log2(y-x+1);
fout<<min(minim[x][k], minim[y-(1<<k)+1][k])<<"\n";
}
}