Pagini recente » Cod sursa (job #1040062) | Cod sursa (job #953431) | Cod sursa (job #2485533) | Cod sursa (job #2074717) | Cod sursa (job #1805486)
#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[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';
}
}