Pagini recente » Profil Liviuc | Cod sursa (job #1463090) | Cod sursa (job #3254953) | Cod sursa (job #2816883) | Cod sursa (job #563944)
Cod sursa(job #563944)
# include <fstream>
# define nmax 100005
using namespace std;
ifstream f ("lca.in");
ofstream g ("lca.out");
int eul[2*nmax],niv[2*nmax],pr[2*nmax],n,m,i,x,nivel,k,q,v[20][2*nmax],lg[2*nmax],y,mm,aux;
struct nod
{
int info;
nod*urm;
}*p,*a[nmax];
void df (int x)
{
nod *p=a[x];
pr[x]=k+1;
while (p)
{
k++;
eul[k]=x;
niv[k]=nivel;
nivel++;
df (p->info);
p=p->urm;
}
k++;
eul[k]=x;
niv[k]=nivel;
nivel--;
}
void rmq ()
{
int i,j;
m=2*n-1;
for (i=2;i<=m;i++)
lg[i]=lg[i/2]+1;
for (i=1;i<=m;i++)
v[0][i]=i;
for (j=1;j<=lg[m];j++)
for (i=1;(k=i+(1<<j-1))<=m;i++)
if (niv[v[j-1][i]]<niv[v[j-1][k]])
v[j][i]=v[j-1][i];
else
v[j][i]=v[j-1][k];
}
int rmq2 (int x,int y)
{
if (x>y)
{
aux=x;
x=y;
y=aux;
}
q=lg[y-x+1];
if (niv[v[q][x]]<niv[v[q][(y-(1<<q))+1]])
return v[q][x];
else
return v[q][(y-(1<<q))+1];
}
int main ()
{
f>>n>>mm;
for (i=2;i<=n;i++)
{
f>>x;
p=new nod;
p->info=i;
p->urm=a[x];
a[x]=p;
}
nivel=0;
df (1);
rmq ();
for (i=1;i<=mm;i++)
{
f>>x>>y;
g<<eul[rmq2(pr[x],pr[y])]<<"\n";
}
return 0;
}