Cod sursa(job #2455067)

Utilizator StanCatalinStanCatalin StanCatalin Data 10 septembrie 2019 18:35:18
Problema Lowest Common Ancestor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream in("lca.in");
ofstream out("lca.out");

const int dim = 100005;

int n,m,st[20][dim],lv[dim];
vector <int> vec[dim];

void dfs(int nod,int lev)
{
    lv[nod] = lev;
    for (int i=0; i<vec[nod].size(); i++)
    {
        dfs(vec[nod][i], lev+1);
    }
}

int main()
{
    in >> n >> m;
    for (int i=2; i<=n; i++)
    {
        in >> st[0][i];
        vec[st[0][i]].push_back(i);
    }
    dfs(1,0);
    for (int j=1; j<=18; j++)
    {
        for (int i=1; i<=n; i++)
        {
            st[j][i] = st[j-1][st[j-1][i]];
        }
    }
    int log1,log2,x,y;
    for (int i=1; i<=m; i++)
    {
        in >> x >> y;
        if (lv[x] < lv[y])
        {
            swap(x,y);
        }
        for (log1=1; (1<<log1) < lv[x]; log1++);
        for (log2=1; (1<<log2) < lv[y]; log2++);

        for (int j=log1; j>=0; j--)
        {
            if (lv[x] - (1<<j) >= lv[y])
            {
                x = st[j][x];
            }
        }
        if (x == y)
        {
            out << x << "\n";
        }
        else
        {

            for (int j=log2; j>=0; j--)
            {
                if (st[j][x] && st[j][x] != st[j][y])
                {
                    x = st[j][x];
                    y = st[j][y];
                }
            }
            out << st[0][x] << "\n";
        }
    }
    return 0;
}