Pagini recente » Cod sursa (job #1265350) | Cod sursa (job #547995) | Cod sursa (job #513827) | Cod sursa (job #1368196) | Cod sursa (job #2285925)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
vector <int> v[100001];
int nivel[100001],e[200001],poz[100001];
int log[4000001];
int rmq[23][200001];
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;
}