Cod sursa(job #1089144)

Utilizator TeOOOVoina Teodora TeOOO Data 21 ianuarie 2014 15:42:25
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
//Include
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;

FILE *in, *out;

//Constante
const int sz = (int)1e5+1;
const int szB = (int)4e5+1;

//Functii
void dfs(int node);

//Variabile
int nodes, questions, limit;
vector <int> graph[sz];
int lg[szB], RMQ[21][szB];
int pos[szB];

//Main
int main()
{
	in = fopen("lca.in", "rt");
	out = fopen("lca.out", "wt");
    fscanf(in,"%d%d", &nodes, &questions);
    for(int i=2; i<=nodes; ++i)
    {
        int node;
        fscanf(in,"%d", &node);
        graph[node].push_back(i);
    }
    dfs(1);

    for(int i=2; i<=limit; ++i)
        lg[i] = lg[i/2] + 1;

    for(int i=1; i<=lg[limit]; ++i)
        for(int j=1; j<limit-(1<<i)+1; ++j)
            RMQ[i][j] = min(RMQ[i-1][j], RMQ[i-1][j+(1<<(i-1))]);

    int from, to;
    while(questions--)
    {
        fscanf(in,"%d%d", &from, &to);
        int left = min(pos[from], pos[to]);
        int right = max(pos[from], pos[to]);
        int line = lg[right - left + 1];

        fprintf(out, "%d\n", min(RMQ[line][left], RMQ[line][right-(1<<line) + 1]));
    }

	fclose(in);
	fclose(out);
	return 0;
}

void dfs(int node)
{
    RMQ[0][++limit] = node;
    pos[node] = limit;

    vector <int>:: iterator it, end = graph[node].end();
    for(it=graph[node].begin(); it!=end; ++it)
    {
        dfs(*it);
        RMQ[0][++limit] = node;
    }
}