Pagini recente » Cod sursa (job #1156956) | Cod sursa (job #291442) | Cod sursa (job #2460436) | Cod sursa (job #451371) | Cod sursa (job #1956071)
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#define NMax 100001
#define MAXNR 999999999
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector <int> v [NMax];
vector <pair <int, int> > rEuler;
int x, y, n, m, pos, nr = 1;
int First[NMax];
pair <int, int> val;
void DF(int R, int nivel) {
rEuler.push_back(make_pair(R, nivel));
First[R] = nr;
nr++;
for(int i = 0; i < v[R].size(); i++) {
DF(v[R][i], nivel + 1);
rEuler.push_back(make_pair(R, nivel));
nr++;
}
}
int RMQ[33][NMax << 4];
int RMQi[33][NMax << 4];
int main()
{
fin>>n>>m;
for(int i = 2; i <= n; i++) {
fin>>x;
v[x].push_back(i);
}
rEuler.push_back(make_pair(0, 0));
DF(1, 0);
nr--;
for(int i = 1; i <= nr; i++) {
RMQ[0][i] = rEuler[i].second;
RMQi[0][i] = rEuler[i].first;
}
/*
nr = 10;
RMQ[0][1] = 1;
RMQ[0][2] = 0;
RMQ[0][3] = 3;
RMQ[0][4] = -4;
RMQ[0][5] = 6;
RMQ[0][6] = 2;
RMQ[0][7] = 5;
RMQ[0][8] = 1;
RMQ[0][9] = 3;
RMQ[0][10] = 7;
*/
int p = 1, k;
cout<<nr<<'\n';
for(int i = 1; i <= log2(nr) + 1; i++) {
k = p;
p = p<<1;
for(int j = 1; j <= nr - p + 1; j++) {
if(RMQ[i - 1][j] > RMQ[i - 1][j + k]) {
RMQ[i][j] = RMQ[i - 1][j + k];
RMQi[i][j] = RMQi[i - 1][j + k];
} else {
RMQ[i][j] = RMQ[i - 1][j];
RMQi[i][j] = RMQi[i - 1][j];
}
//RMQ[i][j] = min(RMQ[i - 1][j], RMQ[i - 1][j + k]);
cout<<RMQ[i][j]<<' ';
}
cout<<'\n';
}
int Left, Right;
for(int i = 1; i <= m; i++) {
fin>>x>>y;
Left = First[x];
Right = First[y];
if(First[x] > First[y]) {
Left = First[y];
Right = First[x];
}
int dif = log2(Right - Left + 1);
int p = 1<<dif;
if(RMQ[dif][Left] > RMQ[dif][Right - p + 1]) {
fout<<RMQi[dif][Right - p];
} else {
fout<<RMQi[dif][Left];
}
fout<<'\n';
}
fin.close();
fout.close();
return 0;
}