Pagini recente » Cod sursa (job #494502) | Cod sursa (job #2596700) | Cod sursa (job #1534561) | Cod sursa (job #1931790) | Cod sursa (job #3003892)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
int log[100005];
vector<int>g[100005];
int noduri;
void logaritm()
{
log[1]=0;
log[2]=1;
for(int i=3;i<=noduri;i++)
log[i]=1+log[i/2];
}
int nivel[100005],level=1;
int stramos[19][100005];
void dfs(int node,int level)
{
nivel[node]=level;
level++;
for(int i=0;i<g[node].size();i++)
{
if(nivel[g[node][i]]==0)
{
dfs(g[node][i],level);
}
}
}
int equalize(int up,int node)
{
for(int i=log[noduri];i>=0;i--)
if(nivel[node]-1>=(1<<i) && up>=(1<<i) && stramos[i][node]!=0)
{
node=stramos[i][node];
up=up-(1<<i);
}
return node;
}
void findstramos(int x,int y)
{
if(x==y)
out<<x<<'\n';
else
{
for(int i=log[noduri];i>=0;i--)
if(stramos[i][x]!=stramos[i][y])
{
x=stramos[i][x];
y=stramos[i][y];
}
out<<stramos[0][x]<<'\n';
}
}
int main()
{
int perechi;
in>>noduri>>perechi;
logaritm();
for(int i=2;i<=noduri;i++)
{
in>>stramos[0][i];
g[stramos[0][i]].push_back(i);
}
dfs(1,1);
for(int i=1;i<=log[noduri];i++)
for(int j=1;j<=noduri;j++)
{
stramos[i][j]=stramos[i-1][stramos[i-1][j]];
}
for(int i=1;i<=perechi;i++)
{
int x,y;
in>>x>>y;
int copil;
if(nivel[x]!=nivel[y])
{
int up=0;
if(nivel[x]>nivel[y])
{
up=nivel[x]-nivel[y];
copil=equalize(up,x);
findstramos(copil,y);
}
else
{
up=nivel[y]-nivel[x];
copil=equalize(up,y);
findstramos(copil,x);
}
}
else
findstramos(x,y);
//out<<nivel[x]<<' '<<nivel[y]<<'\n';
}
return 0;
}