Pagini recente » Cod sursa (job #2426993) | Cod sursa (job #612010) | Borderou de evaluare (job #1567654) | Cod sursa (job #2548061) | Cod sursa (job #1415118)
#include <stdio.h>
#include <vector>
#define NMax 100010
#define minim(a,b)((a>b)?b:a)
using namespace std;
int n,m,x,y,poz[4*NMax],level=-1,D[50][4*NMax],lg[4*NMax],k;
std::vector<int> G[NMax],nivel,nod;
void Parc_Euler(int x0)
{
level+=1;
nivel.push_back(level);
nod.push_back(x0);
if(poz[x0]==0)poz[x0] = nivel.size()-1;
for(int i=0;i<G[x0].size();++i)
{
x = G[x0][i];
Parc_Euler(x);
nivel.push_back(level);
nod.push_back(x0);
}
level-=1;
}
int main()
{
freopen("lca.in","r",stdin);
freopen("lca.out","w",stdout);
scanf("%d %d",&n,&m);
nivel.push_back(0);
nod.push_back(0);
for(int i=2;i<=n;++i)
{
scanf("%d",&x);
G[x].push_back(i);
}
Parc_Euler(1);
/*n = nivel.size()-1;
//printf("%d",n);
for(int i=2;i<=n;++i)lg[i] = lg[i/2]+1;
for(int i=1;i<=n;++i)D[0][i] = i;
for(int i=1;i<=lg[n];++i)
{
for(int j=1;j<=n-(1<<(i-1));++j)
{
if(nivel[D[i-1][j]]<nivel[D[i-1][j+(1<<(i-1))]])D[i][j] = D[i-1][j];
else D[i][j] = D[i-1][j+(1<<(i-1))];
}
}
for(int i=1;i<=m;++i)
{
scanf("%d %d",&x,&y);
x = poz[x];
y = poz[y];
k = lg[y-x+1];
if(nivel[D[k][x]]<nivel[D[k][y-(1<<k)+1]])printf("%d\n",nod[D[k][x]]);
else printf("%d\n",nod[D[k][y-(1<<k)+1]]);
//printf("%d\n",nod[minim(nivel[D[k][x]],nivel[D[k][y-(1<<k)+1]])]);
}*/
return 0;
}