Pagini recente » Cod sursa (job #860667) | Cod sursa (job #3283146) | Cod sursa (job #1679357) | Cod sursa (job #1037382) | Cod sursa (job #1089144)
//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;
}
}