Pagini recente » Cod sursa (job #2551147) | Cod sursa (job #2571410) | Cod sursa (job #2524055) | Cod sursa (job #2656320) | Cod sursa (job #2646497)
#include <bits/stdc++.h>
#define NMAX 100009
#define HMAX 23
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector<int> g[NMAX];
int n,m;
bool uz[NMAX];
int lg;
int sir[2*NMAX];
int lvl[2*NMAX];
int first[NMAX];
int r[2*NMAX][HMAX];
void citire();
void dfs(int k, int niv);
void rmq();
void lca();
int main()
{
citire();
dfs(1,0);
rmq();
lca();
return 0;
}
void citire()
{int x,i;
fin>>n>>m;
for(i=2;i<=n;i++)
{
fin>>x;
g[x].push_back(i);
}
}
void dfs(int k,int niv)
{
int i;
sir[++lg]=k;
lvl[lg]=niv;
first[k]=lg;
for(i=0;i<g[k].size();i++)
{
int act=g[k][i];
dfs(act,niv+1);
sir[++lg]=k;
lvl[lg]=niv;
}
}
void rmq()
{
int i,j;
for(i=1;i<=lg;i++)
{
r[i][0]=i;
}
for(i=1; (1<<i)<=lg;i++)
for(j=1; j+(1<<i)-1 <=lg;j++)
if( lvl[r[j][i-1 ]] < lvl[ r[j+ (1<<(i-1)) ][i-1]] )
{
r[j][i]=r[j][i-1 ];
}
else
r[j][i ]=r[j+ (1<<(i-1))][i-1 ];
}
void lca()
{int i;
int x,y;
for(i=1;i<=m;i++)
{
fin >>x>>y;
x=first[x];
y=first[y];
if(x>y)
swap(x,y);
int care= log2(y-x+1);
fout<<care<<" ";
int sol=0;
if( lvl[ r[x][care] ] <lvl [r [y- (1<<care)+1][care]] )
sol=r[x][care];
else
sol=r [y- (1<<care)+1][care];
fout<<sir[sol]<<'\n';
}
}