Pagini recente » Cod sursa (job #1753663) | Cod sursa (job #2800612) | Cod sursa (job #298372) | Cod sursa (job #447280) | Cod sursa (job #832325)
Cod sursa(job #832325)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int t,poz[222222],lvl[111111],x[222222],w[18][222222],l[222222];
vector <int> a[111111];
ifstream in("lca.in");
ofstream out("lca.out");
void parcurge(int nod,int niv)
{
int i;
if(poz[nod]==0)
poz[nod]=t;
lvl[nod]=niv;
x[t]=nod;
for(i=0;i<a[nod].size();++i)
{
++t;
parcurge(a[nod][i],niv+1);
++t;
x[t]=nod;
}
}
int main()
{
int n,m,i,p,k,j,st,dr,aux;
in>>n>>m;
for(i=2;i<=n;++i)
{
in>>p;
a[p].push_back(i);
}
t=1;
parcurge(1,0);
for(i=1;i<=t;++i)
{
w[0][i]=x[i];
}
p=2;
for(i=1;p<=t;++i)
{
for(j=1;j<=t-p;++j)
{
if(lvl[w[i-1][j]]<lvl[w[i-1][j+p/2]])
w[i][j]=w[i-1][j];
else
w[i][j]=w[i-1][j+p/2];
}
p*=2;
}
p=1;k=0;
for(i=1;i<=t;++i)
{
if(2*p<=i)
{
p*=2;
k++;
}
l[i]=k;
}
for(i=1;i<=m;++i)
{
in>>st>>dr;
st=poz[st];
dr=poz[dr];
if(st>dr)
{
aux=st;
st=dr;
dr=aux;
}
if(lvl[w[l[dr-st+1]][st]]<lvl[w[l[dr-st+1]][dr-(1<<l[dr-st+1])+1]])
out<<w[l[dr-st+1]][st]<<"\n";
else
out<<w[l[dr-st+1]][dr-(1<<l[dr-st+1])+1]<<"\n";
}
return 0;
}