Pagini recente » Cod sursa (job #1525025) | Cod sursa (job #1666866) | Cod sursa (job #2476983) | Cod sursa (job #2484869) | Cod sursa (job #1412480)
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <vector>
#include <math.h>
using namespace std;
int n,m,i,j,lg,t,e[200005],niv[100005],x,y,r[200001][20],l[200001],f[100001];
char *b;
vector<int> G[100001];
void DFS(int s)
{
int i,z=G[s].size();
e[++t]=s;
for (i=0;i<z;i++)
{
niv[G[s][i]]=niv[s]+1;
DFS(G[s][i]);
e[++t]=s;
}
}
void rmq()
{
int i,j,p=1;
for (i=1;i<=t;i++) r[i][0]=e[i];
for (j=1;p<=t;j++)
{
p<<=1;
for (i=1;i<=t-p+1;i++)
if (niv[r[i][j-1]]<=niv[r[i+(1<<(j-1))][j-1]])
r[i][j]=r[i][j-1];
else r[i][j]=r[i+(1<<(j-1))][j-1];
}
j=p=1;
for (i=0;p<=t;i++,p<<=1)
for (;j<p;j++) l[j]=i-1;
for (;j<=t;j++) l[j]=i-1;
}
int lca(int i,int j)
{
int log=l[j-i+1];
if (niv[r[i][log]]<=niv[r[j-(1<<(log))+1][log]])
return r[i][log];
return r[j-(1<<(log))][log];
}
int main()
{
freopen ("lca.in","r",stdin);
freopen ("lca.out","w",stdout);
fseek(stdin,0,SEEK_END);
lg=ftell(stdin);
rewind(stdin);
b=(char*) malloc((lg+1)*sizeof(char));
fread(b,sizeof(char),lg,stdin);
for (j=0;isdigit(b[j]);j++) n=n*10+b[j]-'0';
for (++j;isdigit(b[j]);j++) m=m*10+b[j]-'0';
for (i=2;i<=n;i++)
{
t=0;
for (++j;isdigit(b[j]);j++) t=t*10+b[j]-'0';
G[t].push_back(i);
}
t=0;
DFS(1);
rmq();
while (isspace(b[j])) j++;
j--;
for (i=t;i>=1;i--) f[e[i]]=i;
for (i=1;i<=m;i++)
{
x=y=0;
for (++j;isdigit(b[j]);j++) x=x*10+b[j]-'0';
for (++j;isdigit(b[j]);j++) y=y*10+b[j]-'0';
printf("%i\n",lca(min(f[x],f[y]),max(f[x],f[y])));
}
fclose(stdin);
fclose(stdout);
return 0;
}