Pagini recente » Cod sursa (job #1900234) | Cod sursa (job #433520) | Cod sursa (job #2014950) | Cod sursa (job #1790866) | Cod sursa (job #485747)
Cod sursa(job #485747)
#include <cstdio>
#include <vector>
using namespace std;
#define nmax 100010
vector <int> v[nmax];
int n, m, l, e[2*nmax], r[20][2*nmax], f[2*nmax], lg[20];
void dfs (int nod)
{
e[++l]=nod;
f[nod]=l;
if (v[nod].size())
{
dfs(v[nod].back());
v[nod].pop_back();
dfs(nod);
}
}
void rmq()
{
int i, j;
for (i=2; i<=l; i++) lg[i]=lg[i>>1]+1;
for (i=1; i<=l; i++) r[0][i]=e[i];
for (i=1; 1<<i<l; i++)
for (j=1; j<=l; j++) r[i][j]=min(r[i-1][j], r[i-1][j+(1<<(i-1))]);
}
void lca()
{
int x, y, d;
while (m--)
{
scanf("%d %d",&x,&y);
x=f[x];
y=f[y];
if (x>y)
{
d=x;
x=y;
y=d;
}
d=lg[y-x+1];
printf("%d\n",min (r[d][x], r[d][y-(1<<d)+1]));
}
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d %d",&n,&m);
int i, x;
for (i=2; i<=n; i++)
{
scanf("%d",&x);
v[x].push_back(i);
}
dfs(1);
rmq();
lca();
}