Cod sursa(job #2189433)

Utilizator JiyuuNoTsubasaMaria Guran JiyuuNoTsubasa Data 28 martie 2018 12:14:43
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
vector <int>v[100005];
int stra[20][100005],n,m,viz[100005],niv[100005],x,y;
void dfs(int x)
{
    viz[x]=1;
    for (int i=0; i<v[x].size(); i++)
        if (!viz[v[x][i]]) niv[v[x][i]]=niv[x]+1,dfs(v[x][i]);
}
int lca(int x, int y)
{
    if (niv[x]<niv[y]) swap(x,y);
    int log1,log2;
    for (log1=0; (1<<log1)<=niv[x]; ++log1);
    for (log2=0; (1<<log2)<=niv[y]; ++log2);
    for(int i=log1; i>=0; --i)
        if(niv[x]-(1<<i)>=niv[y])
            x=stra[i][x];
    if(x==y) return x;

    for(int i=log2; i>=0; --i)
        if(stra[i][x] && stra[i][x]!=stra[i][y])
        {
            x=stra[i][x];
            y=stra[i][y];
        }
    return stra[0][x];
}
int main()
{
    in>>n>>m;
    for (int i=2; i<=n; i++)
    {
        in>>stra[0][i];
        v[stra[0][i]].push_back(i);
    }
    for (int i=1; i<=18; i++)
        for (int j=1; j<=n; j++)
            stra[i][j]=stra[i-1][stra[i-1][j]];
    dfs(1);
    for (int i=1; i<=m; i++)
    {
        in>>x>>y;
        out<<lca(x,y)<<'\n';
    }
    return 0;
}