Cod sursa(job #1046448)

Utilizator jul123Iulia Duta jul123 Data 2 decembrie 2013 22:17:03
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#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);
    }

}