Pagini recente » Istoria paginii runda/1234567890/clasament | Cod sursa (job #1605910) | Cod sursa (job #1019396) | Cod sursa (job #1464401) | Cod sursa (job #1568754)
#include <fstream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
vector<int> E[20],v[100010];
int n,m,i,j,k,p,P,q,Q,a,b,niv[100010],pr[100010];
void dfs(int,int);
int main()
{
f>>n>>m;
for(i=2;i<=n;i++)
{
f>>j;
v[j].push_back(i);
}
dfs(1,0);
for(i=0,j=1,p=1,P=2;P<k;i++,j++,p<<=1,P<<=1)
{
Q=k-P+1;
for(q=0;q<Q;q++)
{
a=E[i][q];
b=E[i][q+p];
if(niv[a]>niv[b])
a=b;
E[j].push_back(a);
}
}
for(;m;m--)
{
f>>a>>b;a=pr[a];b=pr[b];
if(a>b)swap(a,b);
j=(int)log2((double)(b-a+1));
p=1<<j;
a=E[j][a];
b=E[j][b-p+1];
if(niv[a]>niv[b])a=b;
g<<a<<'\n';
}
return 0;
}
void dfs(int nod,int nivel)
{
E[0].push_back(nod);pr[nod]=k++;
niv[nod]=nivel;
for(auto it:v[nod])
{
dfs(it,nivel+1);E[0].push_back(nod);k++;
}
}