Cod sursa(job #1910843)

Utilizator Train1Train1 Train1 Data 7 martie 2017 18:34:13
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector <vector <int> > v;
int k = -1;
vector <pair <int, int> > nivel;
int N1, N2, n, m;
void DF(int R) {
    k++;
    nivel.push_back(make_pair(R, k));
    for(int i = 0; i < v[R].size(); i++) {
        DF(v[R][i]);
        nivel.push_back(make_pair(R, k));
    }
    k--;
}
int findNod(int start) {
    int j = 0;
    for (j = start; nivel[j].first != N1 && nivel[j].first != N2; j++);
    return j;
}
int main()
{
    fin>>n>>m;
    int x, y;
    v.resize(n + 1);
    for (int i = 2; i <= n; i++) {
        fin>>x;
        v[x].push_back(i);
    }
    DF(1);
    /*
    for (int i = 0; i <nivel.size(); i++) {
        fout<<nivel[i].first<<' ';
    }
    fout<<'\n';
    for (int i = 0; i <nivel.size(); i++) {
        fout<<nivel[i].second<<' ';
    }
    */
    for (int i = 1; i <= m; i++) {
        fin>>N1>>N2;
        int j = 0, k = 0;
        j = findNod(0);
        k = findNod(j + 1);
        while (j == k) {
            j = k;
            k = findNod(j + 1);
        }
        int min = 999999999, aux;
        for (int p = j; p <= k; p++) {
            if (min > nivel[p].second) {
                min = nivel[p].second;
                aux = nivel[p].first;
            }
        }
        fout<<aux<<' ';
    }
    fin.close();
    fout.close();
    return 0;
}