Pagini recente » Cod sursa (job #1291672) | Cod sursa (job #276471) | Cod sursa (job #636703) | Cod sursa (job #172400) | Cod sursa (job #1537890)
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int nmax=100005;
int euler[2*nmax], lev[nmax], first[nmax], log[2*nmax], rmq[18][2*nmax], nod[18][2*nmax];
int cnt, aux, n, m, i, j, x, y, node;
vector <int> v[nmax];
void dfs(int x)
{
euler[++cnt]=x;
first[x]=cnt;
for(int i=0;i<v[x].size();i++)
{
lev[v[x][i]]=lev[x]+1;
node=v[x][i];
dfs(node);
euler[++cnt]=x;
}
}
int lca(int x, int y)
{
x=first[x];
y=first[y];
if(x>y)
{
aux=x;
x=y;
y=aux;
}
int dif=y-x+1;
int p=log[dif];
if(rmq[p][x]<rmq[p][y-(1<<p)+1])
return nod[p][x];
return nod[p][y-(1<<p)+1];
}
int main()
{
fin>>n>>m;
for(i=2;i<=n;i++)
{
fin>>x;
v[x].push_back(i);
}
for(i=2;i<=2*nmax;i++)
log[i]=log[i/2]+1;
dfs(1);
for(i=1;i<=cnt;i++)
{
rmq[0][i]=lev[euler[i]];
nod[0][i]=euler[i];
}
for(i=1;(1<<i)<=cnt;i++)
{
for(j=1;j+(1<<i)<=cnt;j++)
{
if(rmq[i-1][j]<rmq[i-1][j+(1<<(i-1))])
{
rmq[i][j]=rmq[i-1][j];
nod[i][j]=nod[i-1][j];
}
else
{
rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
nod[i][j]=nod[i-1][j+(1<<(i-1))];
}
}
}
for(i=1;i<=m;i++)
{
fin>>x>>y;
fout<<lca(x,y)<<'\n';
}
return 0;
}