Pagini recente » Cod sursa (job #3264704) | Cod sursa (job #421501) | Cod sursa (job #3140574) | Cod sursa (job #640363) | Cod sursa (job #3001908)
#include <fstream>
#include<algorithm>
#include<vector>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
long long n,m,i,j;
long long rmq[20][1000005],lg[1000005],diff,l,sh,x,y,k,p,x1,y1;
long long euler[1000005],first[1000005],h[10001];
vector <int> v[1000005];
void dfs(int nod , int nivel)
{
euler[++k] = nod;
h[k] = nivel;
first[nod] = k;
for ( int i = 0 ; i < v[nod] . size() ; i++)
{
dfs(v[nod][i] , nivel + 1);
euler[++k] = nod;
h[k] = nivel;
}
}
int main()
{
f>>n>>m;
for(i=2;i<=n;i++)
{f>>x;
v[x].push_back(i);
}
dfs(1,0);
lg[1]=0;
for(i=1;i<=k;i++)
rmq[0][i]=i;
for(i=2;i<=k;i++)
lg[i]=lg[i/2]+1;
for (i=1;(1<<i)<=k;i++)
for (j=1;j+(1<<i)-1<=k;j++)
{rmq[i][j] = rmq[i-1][j];
if(h[rmq[i-1][j + (1<<(i-1))]] < h[rmq[i][j]])
rmq[i][j]=rmq[i-1][j + (1<<(i-1))];
}
for (i=1;i<=m;i++)
{
f>>x>>y;
x1=first[x];
y1=first[y];
if(x1>y1)
swap(x1,y1);
p=y1-x1+1;
l=lg[p];
g<<euler[min(rmq[l][x1],rmq[l][y1-(1<<l)+1])]<<'\n';
}
return 0;
}