Cod sursa(job #1805489)

Utilizator gorneanu.andreiFMI Gorneanu Andrei gorneanu.andrei Data 13 noiembrie 2016 21:53:20
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include<bits/stdc++.h>
#define MAXN 100010
#define MAXL 20
using namespace std;
int euler[4 * MAXN],M2[2 * MAXN][MAXL],level[4 * MAXN],poz[MAXN],n,m = 0,t;
vector <int> tata[MAXN];


void euleer(int nod){

    int i;
    ++m;
    euler[m] = nod;
    level[m] = level[m - 1] + 1;
    poz[nod] = m;


    for(i = 0;i < tata[nod].size(); ++i){

            euleer(tata[nod][i]);
            ++m;
            euler[m] = nod;
            level[m] = level[m - 1] - 1;

            }
    }


void creare_rmq(){

    int i, j;

    for(i = 0;i < m; ++i)
        M2[i][0] = i;

    for(j = 1;(1 << j) <= m; ++j)
        for(i = 0;i + (1 << j) - 1 < m; ++i)
            if(euler[M2[i][j - 1]] < euler[M2[i + (1 << (j - 1))][j - 1]])
                M2[i][j] = M2[i][j - 1];
            else
                M2[i][j] = M2[i + (1 << (j - 1))][j - 1];
}

int rezultat(int i,int j){

    int k;
    k = log2(j - i + 1);
    return min(euler[M2[i][k]],euler[M2[j - (1 << k) + 1][k]]);

}

int min(int i,int j){

    if(i > j)
        return j;
    return i;

}

int main(){

    fstream f("lca.in",ios::in);
    fstream g("lca.out",ios::out);
    f>>n>>t;
    int i,x;
    tata[0].push_back(0);
    tata[0].push_back(1);
    for(i = 1;i < n; ++i){
        f>>x;
        tata[x].push_back(i + 1);
    }

    euleer(1);
    creare_rmq();
    int a,b,c,d,aux;

    for(i = 1;i <= t; ++i){
        f>>a>>b;
        c = poz[a];
        d = poz[b];
        if(c > d){
            aux = c;
            c = d;
            d = aux;
        }
        g<<rezultat(c,d)<<'\n';
    }

}