Pagini recente » Cod sursa (job #1526625) | Cod sursa (job #1575030) | Cod sursa (job #2357247) | Cod sursa (job #1286429) | Cod sursa (job #393630)
Cod sursa(job #393630)
#include<cstdio>
#include<vector>
#define pb push_back
using namespace std;
#define minn(a,b) ((a<b)?a:b)
#define N 100005
int e[19][N<<1],n,m,x,y,dep[N],lung,jum,pr[N],log[N<<1];
int euler[N<<1],nr;
vector<int>arb[N];
char linie[32];
void df(int x)
{
euler[++nr] = x;
if (!pr[x])
pr[x]=nr;
size_t g=arb[x].size(), y;
for (size_t i=0; i<g; ++i)
{
y = arb[x][i];
dep[y] = dep[x] + 1;
df(y);
euler[++nr] = x;
}
}
void rmq()
{
int i;
log[2]=1;
for (i=1;i<=nr;++i)
e[0][i] = euler[i];
for(i=3; i<=nr; ++i)
log[i]=log[i>>1]+1;
for (int i=1; i<=log[nr]; ++i)
{
lung=1<<i;
jum=lung>>1;
for(int j=1; j+lung-1<=nr; ++j)
if(dep[e[i-1][j]]<dep[e[i-1][j+jum]])
e[i][j]=e[i-1][j];
else
e[i][j]=e[i-1][j+jum];
}
}
void solve()
{
if (pr[x]>pr[y])
{
int aux = x;
x = y;
y = aux;
}
int dim=1<<log[pr[y]-pr[x]+1];
int lo=log[pr[y]-pr[x]+1];
if(dep[e[lo][pr[x]]]<dep[e[lo][pr[y]-dim+1]])
x=e[lo][pr[x]];
else
x=e[lo][pr[y]-dim+1];
}
void citire()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=2; i<=n; ++i)
{
scanf("%d",&x);
arb[x].pb(i);
}
df(1);
/*for (int i=1; i<=nr; ++i)
printf("%d %d\n",e[0][i],dep[0][i]);*/
rmq();
/*for (int i=0; i<=log[nr]; ++i)
{
for(int j=1; j<=nr; ++j)
printf("%d ",dep[i][j]);
printf("\n");
}*/
int sp = 0, l, i;
scanf("\n");
while (m--)
{
fgets(linie, sizeof(linie), stdin);
sp = 0;
x = y = 0;
for (l = strlen(linie), i = 0; i < l; ++i)
if (linie[i] == ' ')
sp = 1;
else if (linie[i] >= '0' && linie[i] <= '9')
{
if (!sp) x = x * 10 + (linie[i]-'0');
else y = y * 10 + (linie[i]-'0');
}
else
break;
solve();
printf("%d\n",x);
}
}
int main()
{
citire();
return 0;
}