Cod sursa(job #2676098)

Utilizator LittleGreenMenMihai A LittleGreenMen Data 23 noiembrie 2020 15:22:18
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <vector>

#define _MAX_N 100005

using namespace std;

fstream in("date.in", ios::in);
ofstream out("date.out", ios::out);

vector<int> T[_MAX_N];
vector<int> Tati;
bool vizitat[_MAX_N];
int N, M;

void Read(int &queries)
{
    int x;

    Tati.push_back(0);
    Tati.push_back(-1);

    in >> N >> queries;
    for(int k = 1; k < N; k++) {
        in >> x;

        Tati.push_back(x);
    }
}

int LCA(int x, int y, int nod = 1)
{
    int result = 0;

    if(nod == x || nod == y)
        return nod;

    for(int vecin : T[nod]) {
        int search_result = LCA(x, y, vecin); /// 0 - not found; x/y - a found node; node - lowest common ancestor

        if(search_result != 0) {
            if(result != 0)
                return nod;
            result = search_result;
        }
    }

    return result;
}

void print_mat(ostream &output_stream, vector<int> M[])
{
    for(int i = 1; i <= N; i++) {
        for(int Nod : M[i])
            output_stream << Nod << ' ';
        output_stream << '\n';
    }
}

int main()
{
    int i, j, queries, x, y;
    string output_string;

    Read(queries);

    for(int nod = 2; nod <= N; nod++)
        T[Tati[nod]].push_back(nod);

    for(int q = 1; q <= queries; q++) {
        in >> x >> y;

        output_string += to_string(LCA(x, y));
        output_string += "\n";
    }

    out << output_string;

    in.close();
    out.close();

    return 0;
}