Cod sursa(job #1514596)

Utilizator redcrocodileIlies Andreea redcrocodile Data 31 octombrie 2015 12:48:21
Problema Lowest Common Ancestor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#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;
}