Pagini recente » Cod sursa (job #2467204) | Cod sursa (job #1078770) | Cod sursa (job #2806438) | Cod sursa (job #1056773) | Cod sursa (job #1046448)
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int niv[100001], tata[17][100001], maxpow[100005], maxim=0;
vector<int>c[100001];
void logaritm()
{
maxpow[1] = 0;
for(int i = 2; i <= 100005; i ++)
maxpow[i]=maxpow[i/2] + 1;
}
void afla_nivel(int nod, int nivel)
{
int i;
niv[nod]=nivel;
if(nivel>maxim)
maxim=nivel;
for(i=0; i<c[nod].size(); i++)
{
afla_nivel(c[nod][i], nivel+1);
}
}
int main()
{
FILE *fin, *fout;
fin=fopen("lca.in","r");
fout=fopen("lca.out","w");
int n, m, i, j, x, y, aux, lg, k, p;
fscanf(fin, "%d %d", &n, &m);
logaritm();
for(i=0; i<n-1; i++)
{
fscanf(fin, "%d", &tata[0][i+2]);
c[tata[0][i+2]].push_back(i+2);
}
afla_nivel(1, 0);
lg=maxim;
j=1;
while(j<=lg)
{
for(k=1; k<=n; k++)
tata[j][k]=tata[j-1][tata[j-1][k]];
j++;
}
for(i=0; i<m; i++)
{
fscanf(fin, "%d %d", &x, &y);
if(niv[x]>niv[y])
{
aux=niv[x];
niv[x]=niv[y];
niv[y]=aux;
}
j=17;
p=niv[y]-niv[x];
while(p!=0)
{for(; j>=0 && (1<<j) > p; j--);
y=tata[j][y];
p-=(1<<j);
}
if(x!=y)
{lg=maxpow[niv[x]];
for(j=lg; j>=0; j--)
{
if(tata[j][x]!=0 && tata[j][y]!=0 && tata[j][x] != tata[j][y])
{
x=tata[j][x];
y=tata[j][y];
}
}
fprintf(fout, "%d\n", tata[0][x]);}
else
fprintf(fout, "%d\n", x);
}
}