Pagini recente » Cod sursa (job #1910498) | Cod sursa (job #2605962) | Cod sursa (job #2737495) | Cod sursa (job #2542116) | Cod sursa (job #2285922)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
vector <int> v[100001];
int nivel[100001],e[4000001],poz[100001];
int log[4000001];
int rmq[23][4000001];
int ne=0;
void dfs(int nod)
{
e[++ne]=nod;
poz[nod]=ne;
for(int i=0;i<v[nod].size();i++)
{
nivel[v[nod][i]]=nivel[nod]+1;
dfs(v[nod][i]);
e[++ne]=nod;
}
}
int main()
{
int n,k,i,x,j,a,b,y,l;
in>>n>>k;
for(i=2;i<=n;i++)
{
in>>x;
v[x].push_back(i);
}
dfs(1);
for(i=1;i<=ne;i++)
rmq[0][i]=e[i];
for(i=2;i<=ne;i++)
log[i]=log[i/2]+1;
for(i=1;i<=log[ne];i++)
for(j=(1<<i);j<=ne;j++)
{
rmq[i][j]=rmq[i-1][j];
if(nivel[rmq[i][j]]>nivel[rmq[i-1][j-(1<<(i-1))]])
rmq[i][j]=rmq[i-1][j-(1<<(i-1))];
}
for(i=1;i<=k;i++)
{
in>>a>>b;
x=poz[b];
y=poz[a];
if(x<y)
swap(x,y);
l=log[x-y+1];
out<<min(rmq[l][x],rmq[l][y+(1<<l)-1])<<'\n';
}
return 0;
}