Cod sursa(job #2392245)

Utilizator ezioconnorVlad - Gabriel Iftimescu ezioconnor Data 29 martie 2019 20:16:29
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m, v[100001];
int euler[400001], l[100001], k, pozmin[100001];
vector <int> Muchii[100001];

inline void DFS(int nod, int nivel)
{
    int vecin;
    l[nod] = nivel;
    euler[++k] = nod;
    pozmin[nod] = min(pozmin[nod], k);
    for (int i = 0; i < Muchii[nod].size(); ++i)
    {
        vecin = Muchii[nod][i];
        DFS(vecin, nivel + 1);
        euler[++k] = nod;
        pozmin[nod] = min(pozmin[nod], k);
    }
}

inline void citire()
{
    int x;
    in >> n >> m;
    for (int i = 2; i <= n; ++i)
    {
        in >> x;
        Muchii[x].push_back(i);
    }
}

int main()
{
    int x, y;
    citire();
    for (int i = 1; i <= n; ++i)
        pozmin[i] = INT_MAX;
    DFS(1, 0);
    for (int q = 1; q <= m; ++q)
    {
        in >> x >> y;
        int mind = INT_MAX, rez;
        if (pozmin[x] > pozmin[y])
            swap(x, y);
        for (int i = pozmin[x]; i <= pozmin[y]; ++i)
        {
            if (l[euler[i]] < mind)
            {
                mind = l[euler[i]];
                rez = euler[i];
            }
        }
        out << rez << '\n';
    }
    return 0;
}