Pagini recente » Cod sursa (job #2837043) | Cod sursa (job #222203) | Cod sursa (job #177386) | Cod sursa (job #869032) | Cod sursa (job #3030179)
#include<bits/stdc++.h>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,m,niv[100005],k,e[200005],p[200005],poz[200005];
vector<int>v[100005];
struct elem
{
int x,y;
}sol[200005],rmq[22][200005];
void dfs(int nod, int tata)
{
k++;
sol[k].x=nod;
sol[k].y=niv[nod];
for(auto it:v[nod])
{
if(it!=tata)
{
niv[it]=niv[nod]+1;
dfs(it,nod);
k++;
sol[k].x=nod;
sol[k].y=niv[nod];
}
}
}
signed main()
{
int i,x,c,y;
f>>n>>m;
for(i=2;i<=n;i++)
f>>x,v[i].push_back(x),v[x].push_back(i);
dfs(1,0);
for(i=1;i<=k;i++)
{
if(poz[sol[i].x]==0)
poz[sol[i].x]=i;
}
x=1;
c=0;
for(i=1;i<=k;i++)
{
if(2*x==i)
x*=2,c++;
e[i]=c;
p[c]=x;
}
for(i=1;i<=k;i++)
rmq[0][i]=sol[i];
x=2;
c=1;
while(x<=k)
{
for(i=1;i<=k-x+1;i++)
{
if(rmq[c-1][i].y<rmq[c-1][i+x/2].y)
rmq[c][i]=rmq[c-1][i];
else
rmq[c][i]=rmq[c-1][i+x/2];
}
x*=2;
c++;
}
for(i=1;i<=m;i++)
{
f>>x>>y;
x=poz[x];
y=poz[y];
if(x>y)
swap(x,y);
int dist=y-x+1;
int nr=e[dist];
int nr1=p[nr];
if(rmq[nr][x].y<rmq[nr][y-nr1+1].y)
g<<rmq[nr][x].x;
else
g<<rmq[nr][y-nr1+1].x;
g<<'\n';
}
return 0;
}