Pagini recente » Cod sursa (job #3040530) | Cod sursa (job #327739) | Cod sursa (job #1040615) | Cod sursa (job #381899) | Cod sursa (job #1075212)
//
// 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;
}