Cod sursa(job #1774740)

Utilizator tqmiSzasz Tamas tqmi Data 9 octombrie 2016 13:25:33
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
const int NMax = 100005;
int N,M,lev[NMax],lm;
int T[20][NMax];
int log[NMax];
vector<int> G[NMax];
void read()
{
    fin>>N>>M;
    for(int i=2;i<=N;i++)
    {
        fin>>T[0][i];
        G[T[0][i]].push_back(i);
    }
}
void prec()
{
    for(int i=2;i<=lm;i++)
    {
        log[i]=log[i/2]+1;
    }
    for(int i=1;i<=log[lm];i++)
        for(int j=1;j<=N;j++)
            T[i][j] = T[i-1][T[i-1][j]];
}
void Dfs(int nod)
{
    for(int i=0;i<G[nod].size();i++)
    {
        int Vecin=G[nod][i];
        lev[Vecin]=lev[nod]+1;
        lm=max(lm,lev[Vecin]);
        Dfs(Vecin);
    }
}
int lca(int x,int y)
{
    if(lev[x]<lev[y])
        swap(x,y);
    while(lev[x]!=lev[y])
        x=T[log[lev[x]-lev[y]]][x];
    if(x==y) return x;
    for(int i=log[lev[x]];i>=0;i--)
    {
        if(T[i][x]!=T[i][y])
        {
            x=T[i][x];
            y=T[i][y];
        }
    }
    return T[0][x];
}
void solve()
{
    Dfs(1);
    prec();
    for(int i=1;i<=M;i++)
    {
        int x,y;
        fin>>x>>y;
        fout<<lca(x,y)<<"\n";
    }
}


int main()
{
    read();
    solve();
    return 0;
}