Cod sursa(job #1075212)

Utilizator impulseBagu Alexandru impulse Data 8 ianuarie 2014 19:07:54
Problema Lowest Common Ancestor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
//
//  main.c
//  lca
//
//  Created by Alexandru Bâgu on 1/8/14.
//  Copyright (c) 2014 Alexandru Bâgu. All rights reserved.
//

#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <fstream>
using namespace std;
/*typedef struct pItem
{
    int v;
    struct pItem *next;
} item;

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

#define maxn 100005

int n, q, T[maxn], T2[maxn], LEV[maxn];
const int lev_reset = 200;
//FILE *fin, *fout;
//item* C[maxn];
vector<int> C[maxn];
typedef vector<int>::iterator iter;

void dfs(int nod, int n1, int lev)
{
    LEV[nod] = lev;
    T2[nod] = n1;
    
    if(lev % lev_reset == 0) n1 = nod;
    
    vector<int> v = C[nod];
    iter it = v.begin();
    while(it != v.end())
    {
        dfs(*it, n1, lev+1);
        it++;
    }
}

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(int argc, const char * argv[])
{
    ifstream fin("lca.in");
    ofstream fout("lca.out");
    //fin = fopen("lca.in", "r");
    //fout = fopen("lca.out", "w");
    //fscanf(fin, "%d %d", &n, &q);
    fin>>n>>q;
    int i;
    for(i = 0; i <= maxn; i++)
    {
        //C[i] = new_item();
        T[i] = 0;
    }
    for(i = 2; i <= n; i++)
    {
        fin>>T[i];
        //fscanf(fin, "%d", &T[i]);
        //add(C[T[i]], i);
        C[T[i]].push_back(i);
    }
    dfs(1, 0, 0);
    int x, y;
    while(q > 0)
    {
        fin>>x>>y;
        //fscanf(fin, "%d %d", &x, &y);
        fout<<lca(x,y)<<endl;
        //fprintf(fout, "%d\n", lca(x,y));
        q--;
    }
    fin.close();//fclose(fin);
    fout.close();//fclose(fout);
    return 0;
}