Cod sursa(job #1734802)

Utilizator tudorgalatanRoman Tudor tudorgalatan Data 28 iulie 2016 12:11:17
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>

using namespace std;

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

unsigned int n, m;
unsigned int father[100001];
unsigned int u, v;

const int h=200;
unsigned int grandpa[100001];
unsigned int lev[100001];
unsigned int i;

vector <int> ls[100001];

int main()
{
    ifstream fin ("lca.in");
    fin >> n >> m;
    for (i=2; i<=n; i++)
    {
        fin >> father[i];
        ls[father[i]].push_back(i);
    }
    DFS(1,1,0);
    ofstream fout ("lca.out");
    for (i=1; i<=m; i++)
    {
        fin >> u >> v;
        while (grandpa[u] != grandpa[v])
            if (lev[u] > lev[v])
                u = grandpa[u];
            else
                v = grandpa[v];
        while (u != v)
            if (lev[u] > lev[v])
                u = father[u];
            else
                v = father[v];
        fout << u << '\n';
    }
    fout.close();
    fin.close();
    return 0;
}

void DFS (int node, int first, int level)
{
    unsigned int i;
    grandpa[node] = first;
    lev[node] = level;
    if (level%h == 0)
        first = node;
    for (i=0; i<ls[node].size(); i++)
        DFS(ls[node][i],first,level+1);
}