Cod sursa(job #1888907)

Utilizator tudorgalatanRoman Tudor tudorgalatan Data 22 februarie 2017 13:41:24
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <vector>

using namespace std;

void DFS (unsigned int node, unsigned int first, unsigned int level);

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

unsigned int n, m;
unsigned int Fa[100001];            /// Father
unsigned int u, v;

vector <unsigned int> G[100001];
unsigned int GFa[100001];           /// Grandfather
unsigned int lvl[100001];           /// Tree level
unsigned int i;

unsigned int lca;                   /// Lowest Common Ancestor

int main ()
{
    fin >> n >> m;                  /// READ
    for (i=2; i<=n; i++)
    {
        fin >> Fa[i];
        G[Fa[i]].push_back(i);
    }
    DFS(1,1,0);
    for (i=1; i<=m; i++)
    {
        fin >> u >> v;
        while (GFa[u] != GFa[v])
            if (lvl[u] > lvl[v])
                u = GFa[u];
            else
                v = GFa[v];
        while (u != v)
            if (lvl[u] > lvl[v])
                u = Fa[u];
            else
                v = Fa[v];
        lca = u;
        fout << lca << '\n';
    }
    return 0;
}

void DFS (unsigned int node, unsigned int first, unsigned int level)
{
    unsigned int i;
    GFa[node] = first;                      /// Calculate GFa of node.
    lvl[node] = level;                      /// Calculate lvl of node.
    if (level%200 == 0)
        first = node;                       /// Calculate first node.
    for (i=0; i<G[node].size(); i++)
        DFS(G[node][i],first,level+1);      /// Continue DFS
}