Pagini recente » Cod sursa (job #1634773) | Cod sursa (job #2165146)
#include <fstream>
#include<cmath>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int v[100001],use[100001],nivel[100001],m[100001][20],fr[100001];
struct nod
{
int inf;
nod *urm;
}*l[100001],*p;
int n,m2,k=0,nr=0;
void adaug(int x, nod*&p)
{
nod *c;
c=new nod;
c->inf=x;
c->urm=p;
p=c;
}
void creare()
{
int i,x;
for(i=2;i<=n;i++)
{
f>>x;
adaug(i,l[x]);
// adaug(x,i);
}
}
void df(int i,int nr)
{
nod *c;
v[++k]=i;
nivel[k]=nr;
if(!fr[i]) fr[i]=k;
use[i]=1;
for(c=l[i];c;c=c->urm)
if(!use[c->inf]) {df(c->inf,nr+1);v[++k]=i;nivel[k]=nr;}
}
int main()
{
f>>n>>m2;
int x,y;
creare();
df(1,0);
for(int i=1;i<=k;i++)
m[i][0]=i;
for(int j=1;(1<<j)<=k;j++)
for(int i=1;i+(1<<j)-1<=k;i++)
if(nivel[m[i][j-1]]<nivel[m[i+(1<<(j-1))][j-1]])
m[i][j]=m[i][j-1];
else m[i][j]=m[i+(1<<(j-1))][j-1];
while(f>>x>>y)
{
x=fr[x];
y=fr[y];
if(x>y) swap(x,y);
int k =(int)log2(y-x+1);
if(nivel[m[x][k]]<nivel[m[y-(1<<k)+1][k]])
g<<v[m[x][k]]<<'\n';
else g<<v[m[y-(1<<k)+1][k]]<<'\n';
}
return 0;
}