Cod sursa(job #2585406)

Utilizator gabbie02Thomits Gabriel gabbie02 Data 19 martie 2020 01:19:15
Problema Lowest Common Ancestor Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <fstream>
#include <list>

using namespace std;

list<unsigned int> adjlist[100001];
unsigned int first[100001];
unsigned int level[100001];
bool vis[100001];
unsigned int* eul;

void dfs(unsigned int node, unsigned int& index)
{
    vis[node] = true;
    eul[index] = node;
    first[node] = index++;
    for(list<unsigned int>::iterator it = adjlist[node].begin(); it != adjlist[node].end(); it++){
        if(!vis[*it]){
            level[*it] = level[node] + 1;
            dfs(*it, index);
            eul[index++] = node;
        }
    }
}

unsigned int lca(unsigned int i, unsigned int j)
{
    unsigned int node = i;
    for(unsigned int x = first[i] + 1; x <= first[j]; x++){
        if(level[eul[x]] < level[node]){
            node = eul[x];
        }
    }
    return node;
}

int main()
{
    ifstream fin("lca.in");
    ofstream fout("lca.out");
    unsigned int n, q, i, j, child = 2;
    fin >> n >> q;
    eul = new unsigned int[(n << 1) - 1];
    for(i = 1; i < n; i++){
        fin >> j;
        adjlist[child].push_back(j);
        adjlist[j].push_back(child);
        child++;
    }
    child = 0;
    dfs(1, child);
    while(q){
        fin >> i >> j;
        if(first[i] > first[j]){
            child = i;
            i = j;
            j = child;
        }
        fout << lca(i, j) << '\n';
        q--;
    }
    return 0;
}