Cod sursa(job #2084652)

Utilizator netfreeAndrei Muntean netfree Data 9 decembrie 2017 11:16:20
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <bits/stdc++.h>

using namespace std;

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

const int N_MAX = 100005;

int n, m;
int euler[3 * N_MAX], ne;
int poz[N_MAX], niv[N_MAX];

vector<int> vec[N_MAX];

void make_euler(int nod, int nivel){
    euler[++ne] = nod;
    niv[ne] = nivel;
    poz[nod] = ne;
    for(auto v : vec[nod]){
        make_euler(v, nivel + 1);
        euler[++ne] = nod;
        niv[ne] = nivel;
    }
}

int main()
{
    fin >> n >> m;
    for(int i = 2, x; i<=n; ++i){
        fin >> x; vec[x].push_back(i);
    }
    make_euler(1, 0);

//    for(int i = 1; i<=ne; ++i)
//        cout << euler[i] << " ";
//    cout << endl;
//    for(int i = 1; i<=ne; ++i)
//        cout << niv[i] << " ";

    while(m--){
        int a, b; fin >> a >> b;
        int minn = INT_MAX;
        int ans = 0;
        for(int i = min(poz[a], poz[b]); i<=max(poz[a], poz[b]); ++i){
            if (niv[i] < minn){
                minn = niv[i];
                ans = euler[i];
            }
        }
        fout << ans << endl;
    }
    return 0;
}