Pagini recente » Cod sursa (job #2045406) | Cod sursa (job #1817845) | Cod sursa (job #1234769) | Rating Grigorescu Stefan Dumitru (SteFUN) | Cod sursa (job #1514596)
#include <fstream>
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int dad[23][250022],n,i,j,nr,m,jj,a,b,ad[100001];
int putere(int n)
{
int nr=-1,i;
for(i = 1; i <= n; i *= 2)
nr++;
jj=i/2;
return nr;
}
void creare()
{
int nn;
for (i = 2; i <= n; i++)
{
f>>dad[0][i];
ad[i]=ad[dad[0][i]]+1;
nn=putere(i);
for(j=1; j<=nn; j++)
dad[j][i]=dad[j-1][dad[j-1][i]];
}
}
void indreptare(int &a, int nr)
{
int x;
while(nr)
{
x=putere(nr);
a=dad[x][a];
nr-=jj;
}
}
int cond(int x)
{
if (dad[x][a]==dad[x][b]) return 1;
return 0;
}
int cautare()
{
int step, ans;
for(step = 1; step <= 20; step *= 2);
for(ans = 0; step; step /= 2)
if(step + ans <= 20 && !cond(step + ans))
ans += step;
return ans;
}
void solutie()
{int x;
for (i=1;i<=m;i++)
{
f>>a>>b;
if(ad[a]>ad[b]) indreptare(a,ad[a]-ad[b]); else indreptare(b,ad[b]-ad[a]);
while(a!=b)
{
x=cautare();
a=dad[x][a];
b=dad[x][b];
nr-=jj;
}
g<<a<<"\n";
}
}
int main()
{
f>>n>>m;
creare();
solutie();
return 0;
}