Cod sursa(job #1075169)

Utilizator impulseBagu Alexandru impulse Data 8 ianuarie 2014 18:29:58
Problema Lowest Common Ancestor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.57 kb
#include <fstream>
#include <vector>

using namespace std;

#define MAX_N 100005

ifstream fin ("lca.in");
ofstream fout ("lca.out");

const int h = 200;

int N, M, T[MAX_N], T2[MAX_N], Lev[MAX_N];
vector <int> G[MAX_N];
typedef vector<int>::iterator iter;

void citire()
{
    fin >> N >> M;
    
    for(int i = 2; i <= N; ++i)
    {
        fin >> T[i];
        G[T[i]].push_back(i);
    }
}

void dfs(int nod, int n1, int lev)
{
    Lev[nod] = lev;
    T2[nod] = n1;
    
    if(lev % h == 0) n1 = nod;
    vector<int> V = G[nod];
    for(iter it = V.begin(); it != V.end(); ++it)
    //foreach(G[nod])
        dfs(*it, n1, lev+1);
}

int lca(int x, int y)
{
    while(T2[x] != T2[y])
        if(Lev[x] > Lev[y])
            x = T2[x];
        else
            y = T2[y];
    
    while(x != y)
        if(Lev[x] > Lev[y])
            x = T[x];
        else
            y = T[y];
    
    return x;
}

int main()
{
    citire();
    dfs(1, 0, 0);
    
    while(M--)
    {
        int x, y;
        fin >> x >> y;
        
        fout << lca(x, y) << "\n";
    }
}
/*
//
//  main.c
//  lca
//
//  Created by Alexandru Bâgu on 1/8/14.
//  Copyright (c) 2014 Alexandru Bâgu. All rights reserved.
//

#include <stdio.h>

typedef struct pItem
{
    int v;
    struct pItem *next;
} item;

void add(item* p, int v)
{
    while(p->next != NULL)
        p = p->next;
    p->v = v;
    p->next = (item*)malloc(sizeof(item));
    p->next->next = NULL;
}

#define maxn 100002

item C[maxn];
int n, q, T[maxn], T2[maxn], LEV[maxn];
const int lev_reset = 200;


void dfs(int nod, int n1, int lev)
{
    LEV[nod] = lev;
    T2[nod] = n1;
    
    if(lev % lev_reset == 0) n1 = nod;
    
    item* i = C + nod;
    while(i->next != NULL)
    {
        dfs(i->v, n1, lev+1);
        i = i->next;
    }
}

int lca(int x, int y)
{
    while(T2[x] != T2[y])
        if(LEV[x] > LEV[y])
            x = T2[x];
        else
            y = T2[y];
    
    while(x != y)
        if(LEV[x] > LEV[y])
            x = T[x];
        else
            y = T[y];
    
    return x;
}

void read()
{
    scanf("%d %d", &n, &q);
    int i;
    for(i = 0; i <= maxn; i++)
    {
        C[i].v = 0;
        C[i].next = NULL;
        T[i] = 0;
    }
    for(i = 2; i <= n; i++)
    {
        scanf("%d", T + i);
        add(&C[T[i]], i);
    }
    dfs(1, 0, 0);
}

void solve()
{
    int x, y;
    while(q-- > 0)
    {
        scanf("%d %d", &x, &y);
        printf("%d\n", lca(x,y));
    }
}

int main(int argc, const char * argv[])
{
    freopen("lca.in", "r", stdin);
    freopen("lca.out", "w", stdout);
    
    read();
    solve();
    return 0;
}
*/