Cod sursa(job #1880985)

Utilizator medicinedoctoralexandru medicinedoctor Data 16 februarie 2017 08:21:54
Problema Lowest Common Ancestor Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
#include <vector>
#include <algorithm>
//60 puncte

using namespace std;

ifstream cin ("lca.in");
ofstream cout("lca.out");

vector <int> a;
int m,x,y;

void read()
{
    int n;
    cin >> n >> m; // n - numarul de noduri
    a.resize(n+1);
    for (int i=2; i<a.size(); cin >> a[i++]);
    a[1]=1;
}

void lca()
{
    vector <int> q(1),w(1);
    q[0]=x,w[0]=y;
    for (int i=a[x]; i!=1; )
        q.push_back(i),i=a[i];
    for (int i=a[y]; i!=1; )
        w.push_back(i),i=a[i];

    if (q.size()<w.size())
    {
        for (int i=0; i<q.size(); i++)
            if (binary_search(w.rbegin(),w.rend(),q[i]))
            {
                cout << q[i] << '\n';
                return;
            }
    }
    else
    {
        for (int i=0; i<w.size(); i++)
            if (binary_search(q.rbegin(),q.rend(),w[i]))
            {
                cout << w[i] << '\n';
                return;
            }
    }
    cout << "1\n";
}

main()
{
    read();
    for (int i=0; i<m; i++)
    {
        cin >> x >> y;
        lca();
    }
}