Pagini recente » Cod sursa (job #2091807) | Cod sursa (job #109408) | Cod sursa (job #2207610) | Cod sursa (job #2898000) | Cod sursa (job #1006273)
#include <cstdio>
#include <vector>
#include <cstring>
#include <cstdlib>
#define N 100005
using namespace std;
vector <int> G[N];
int n,m,t[N],k,a[N<<1],niv[N<<1],f[N],rm[N<<1][20],log[N<<1];
inline int min(int x,int y){ if(x<y)return x; else return y; return 0; }
void parcurg_euler(int nod,int l)
{ int i;
a[++k]=nod; niv[k]=l; f[nod]=k;
for(i=0;i<G[nod].size();++i)
{
parcurg_euler(G[nod][i],l+1);
a[++k]=nod; niv[k]=l;
}
}
void rmq()
{ int i,j;
log[1]=0; rm[1][0]=1;
for(i=2;i<=k;++i){ log[i]=log[i>>1]+1; rm[i][0]=i; }
for(j=1;(1<<j)<=k;++j)
for(i=1;i<=k-(1<<j)+1;++i)
if(niv[rm[i][j-1]]<niv[rm[i+(1<<(j-1))][j-1]])rm[i][j]=rm[i][j-1];
else rm[i][j]=rm[i+(1<<(j-1))][j-1];
}
int main()
{ int m,x,y,dif;
char sir[N*10],*p;
freopen("lca.in","r",stdin); scanf("%d %d\n",&n,&m);
gets(sir); p=strtok(sir," "); int i=2;
while(p!=NULL)
{
t[i]=strtol(p,NULL,10); G[t[i]].push_back(i);
++i; p=strtok(NULL," ");
}
parcurg_euler(1,0);
rmq();
freopen("lca.out","w",stdout);
for(;m>=1;--m)
{
scanf("%d %d\n",&x,&y);
if(f[x]>f[y])x=x^y^(y=x); // interschimba x cu y
dif=log[f[y]-f[x]+1];
if(niv[rm[f[x]][dif]]<niv[rm[f[y]-(1<<dif)+1][dif]])printf("%d\n",a[rm[f[x]][dif]]);
else printf("%d\n",a[rm[f[y]-(1<<dif)+1][dif]]);
}
fclose(stdin);
fclose(stdout);
return 0;
}