Cod sursa(job #1290877)

Utilizator cdascaluDascalu Cristian cdascalu Data 11 decembrie 2014 21:49:15
Problema Lowest Common Ancestor Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<iostream>
#include<vector>
#include<math.h>
#include<fstream>
#define Nmax 100001
using namespace std;


void build(int node, vector<int> G[], int T2[], int level[], int lev, int H, int val)
{
    level[node] = lev;
    T2[node] = val;
    if( (lev - 1) % H == 0)
        val = node;

    for(auto it = G[node].begin(); it != G[node].end(); ++it)
        build(*it, G, T2, level, lev+1, H, val);
}
int query(int x, int y, int T[], int T2[], int level[])
{
    while(T2[x] != T2[y])
        if(level[x] >= level[y])
            x = T2[x];
        else
            y = T2[y];

    while(x != y)
        if(level[x] >= level[y])
            x = T[x];
        else
            y = T[y];

    return x;
}
int main()
{
    int N, M, T[Nmax], T2[Nmax], lev[Nmax];
    vector<int> G[Nmax];
    ifstream f("lca.in");
    f>>N>>M;
    T[1] = 1;
    for(int i=2;i<=N;++i)
    {
        f>>T[i];
        G[T[i]].push_back(i);
    }

    int H = sqrt(N);
    build(1, G, T2, lev, 1, H, 1);

    int x, y;
    ofstream g("lca.out");
    while(M--)
    {
        f>>x>>y;
        g<<query(x, y, T, T2, lev)<<"\n";
    }
    f.close();
    return 0;
}