Cod sursa(job #1880602)

Utilizator medicinedoctoralexandru medicinedoctor Data 15 februarie 2017 20:37:29
Problema Lowest Common Ancestor Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <fstream>
#include <vector>
#include <algorithm>

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(); i++)
    {
        cin >> n; //stramosul nodului i
        a[i]=n;
    }
    a[1]=1;
}

void lca()
{
    if (x==1 || y==1)
    {
        cout << "1\n";
        return;
    }
    if (x==y)
    {
        cout << x << '\n';
        return;
    }
    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();
    }
}