Pagini recente » Monitorul de evaluare | Cod sursa (job #2800043) | Cod sursa (job #2321956) | Clasament oji2017cls9sim | Cod sursa (job #2972876)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
int rmq[18][100005];
int lvl[300005];
int lg[300005];
int frst[100005],eul[300005],p[300005];
int nr=0;
int n,m;
vector<int>g[100005];
void dfs(int x, int niv)
{
nr++;
lvl[nr]=niv;
frst[x]=nr;
eul[nr]=x;
for(int i=0; i<g[x].size(); i++)
{
int y=g[x][i];
dfs(y,niv+1);
eul[++nr]=x;
lvl[nr]=niv;
}
}
void rmq_wow()
{
for(int i=1; i<=nr; i++)
rmq[0][i]=i;
for(int i=2; i<=nr; i++)
p[i]=p[(i>>1)]+1;
for(int i=1; (1<<i)<=nr; i++)
for(int j=1; j<=nr-(1<<i); j++)
{
int lg2=1<<(i-1);
if(lvl[rmq[i-1][j]]<lvl[rmq[i-1][j+lg2]])
rmq[i][j]=rmq[i-1][j];
else
rmq[i][j]=rmq[i-1][j+lg2];
}
}
int lca_naspa(int x, int y)
{
x=frst[x];
y=frst[y];
if(x>y)swap(x,y);
int lg2=p[y-x+1],poz;
if(lvl[rmq[lg2][x]]<lvl[rmq[lg2][y-(1<<lg2)+1]])
poz=rmq[lg2][x];
else
poz=rmq[lg2][y-(1<<lg2)+1];
return eul[poz];
}
int main()
{
fin>>n>>m;int i,x,y;
for(i=2; i<=n; i++)
{
fin>>x;
g[x].push_back(i);
}
dfs(1,1);
rmq_wow();
for(int i=1;i<=m;i++)
{
fin>>x>>y;
fout<<lca_naspa(x,y)<<'\n';
}
return 0;
}