Cod sursa(job #1261283)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 12 noiembrie 2014 10:13:09
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
#define Nmax 100001
#define LOG 18

vector< int > G[Nmax];
vector< bool > viz(Nmax);
int S[Nmax], vf;
int h[Nmax];
int v[2 * Nmax], poz[Nmax];
int RMQ[LOG][2 * Nmax], log[2 * Nmax];

int main()
{
    int i, a, b, q, n, nr = 0, d;
    bool ok;
    fin >> n >> q;
    
    for(i = 2; i <= n; ++i)
    {
        fin >> a;
        G[a].push_back(i);
    }
    
    // parcurgere DFS
    S[0] = 1; vf = 0; viz[1] = 1; h[1] = 0;
    while(vf >= 0)
    {
        a = S[vf]; ok = 0;
        v[++nr] = a;
        if(!poz[a]) poz[a] = nr;
        
        for(auto it = G[a].begin(); it != G[a].end() && !ok; ++it)
            if(!viz[*it])
            {
                S[++vf] = (*it);
                h[*it] = 1 + h[a];
                ok = 1;
                viz[*it] = 1;
            }
        if(!ok) S[vf--] = 0;
    }
    
    // preprocess
    for(i = 1; i <= nr; ++i) RMQ[0][i] = v[i];
    for(d = 1; (1 << d) <= nr; ++d)
    {
        for(i = 1; i + (1 << d) - 1 <= nr; ++i)
            RMQ[d][i] = (h[RMQ[d-1][i]] < h[RMQ[d-1][i + (1 << (d-1))]] ?
                         RMQ[d-1][i] : RMQ[d-1][i + (1 << (d-1))]);
    }
    for(log[1] = 0, i = 2; i <= nr; ++i) log[i] = 1 + log[i >> 1];
    
    //solve
    for(i = 1; i <= q; ++i)
    {
        fin >> a >> b;
        
        if(a == b)
        {
            fout << a << '\n';
            continue;
        }
        if(poz[a] > poz[b]) swap(a, b);
        
        d = log[poz[b] - poz[a] + 1];
        fout << (h[ RMQ[d][poz[a]] ] < h[ RMQ[d][poz[b] - (1 << d) + 1] ] ?
                 RMQ[d][poz[a]] : RMQ[d][poz[b] - (1 << d) + 1]) << '\n';
    }
    return 0;
}