Cod sursa(job #2353112)

Utilizator BlkAlexAlex Negru BlkAlex Data 23 februarie 2019 21:27:29
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <bits/stdc++.h>
#define MAX 10000

using namespace std;

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

vector < int > G[MAX];
int n, m, t[MAX], lvl[MAX];

void facemlca (int a, int b){
    if (t[a] == t[b]){
        g << t[a] << '\n';
        return;
    }
    if (t[a] == b){
        g << b << '\n';
        return;
    }
    if (t[b] == a){
        g << a << '\n';
        return;
    }
    while (t[a] != t[b]){
        while (lvl[a] < lvl[b]){
            a = t[a];
        }
        while (lvl[b] < lvl[a]){
            b = t[b];
        }
        if (lvl[a] == lvl[b] && t[a]!=t[b]){
            a = t[a];
            b = t[b];
        }
    }
    g << t[a] << '\n';
}

int main()
{
    f >> n >> m;
    lvl[1] = 1;
    for (int i = 1; i <= n-1; i++){
        int x;
        f >> x;
        t[i+1] = x;
        lvl[i+1] = lvl[x] + 1;
        G[x].push_back(i + 1);
        G[i + 1].push_back(x);
    }

    while (m--){
        int a, b;
        f >> a >> b;
        facemlca (a,b);
    }
    return 0;
}