Cod sursa(job #941442)

Utilizator SteveStefan Eniceicu Steve Data 18 aprilie 2013 20:30:33
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

int N, M, cnt = -1;
vector <int> muchii[100011];
int indice[100011];
int ST[200011][19];
int Rep_Euler[200011];

void DFS (int nod, int depth)
{
    Rep_Euler[++cnt] = nod;
    indice[nod] = cnt;
    for (int i = 0; i < muchii[nod].size (); i++)
    {
        DFS (muchii[nod][i], depth + 1);
        Rep_Euler[++cnt] = nod;
    }
}

void Precalc_ST ()
{
    for (int i = 0; i <= cnt; i++)
        ST[i][0] = i;
    for (int j = 1; (1 << j) <= cnt + 1; j++)
        for (int i = 0; i + (1 << j) - 1 <= cnt; i++)
            if (Rep_Euler[ST[i][j - 1]] < Rep_Euler[ST[i + (1 << (j - 1))][j - 1]]) ST[i][j] = ST[i][j - 1];
            else ST[i][j] = ST[i + (1 << (j - 1))][j - 1];
}

int main ()
{
    ifstream fin ("lca.in");
    ofstream fout ("lca.out");
    fin >> N >> M;
    for (int i = 2, a; i <= N; i++)
    {
        fin >> a;
        muchii[a].push_back (i);
    }
    DFS (1, 0);
    Precalc_ST ();
    for (int i, j, k; M; M--)
    {
        fin >> i >> j;
        i = indice[i];
        j = indice[j];
        if (i > j) swap (i, j);
        for (k = 0; (1 << k) <= j - i + 1; k++);
        k--;
        fout << min (Rep_Euler[ST[i][k]], Rep_Euler[ST[j - (1 << k) + 1][k]]) << "\n";
    }
    fin.close ();
    fout.close ();
    return 0;
}