Cod sursa(job #1518481)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 5 noiembrie 2015 22:06:22
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <fstream>
#include <vector>

#define NMax 100010

using namespace std;

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

int nodes, queries, father[NMax], disTree[NMax], level[NMax], lev = -1;

vector<int> tree[NMax];

void DFS(int node)
{
    level[node] = ++lev;
    
    for (vector<int>::iterator it = tree[node].begin(); it != tree[node].end(); it++)
        DFS(*it);
    
    lev--;
}

int main()
{
    f>>nodes>>queries;
    
    for (int i=2; i<=nodes; i++) {
        f>>father[i];
        tree[father[i]].push_back(i);
    }
    
    DFS(1);
    
    int x, y;
    for (int i=1; i<=queries; i++) {
        f>>x>>y;
        
        while (level[x] > level[y])
            x = father[x];
        while (level[y] > level[x])
            y = father[y];
        
        while (x != y) {
            x = father[x];
            y = father[y];
        }
        
        g << x << "\n";
    }
    return 0;
}