Pagini recente » Cod sursa (job #2930463) | Cod sursa (job #629682) | Cod sursa (job #3004204) | Cod sursa (job #635562) | Cod sursa (job #2802462)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin ("lca.in" );
ofstream cout ( "lca.out" );
#define NMAX 100000
#define POW2MAX 18
vector<int> arbore[NMAX + 1];
int euler[2 * NMAX + 1];
int heuler[2 * NMAX + 1];
int poz_euler[2 * NMAX + 1];
int logg2[2 * NMAX + 1];
int poz = 1;
int rmq[2 * NMAX + 1][POW2MAX];
void DFS ( int nod, int inaltime ) {
euler[poz] = nod;
poz_euler[nod] = poz;
heuler[poz++] = inaltime;
for ( auto copil: arbore[nod] ) {
DFS(copil, inaltime + 1);
euler[poz] = nod;
poz_euler[nod] = poz;
heuler[poz++] = inaltime;
}
}
int main() {
int n, m, i, j, tata, a, b, poz1, poz2, lungime;
cin >> n >> m;
for ( i = 1; i < n; i++ ) {
cin >> tata;
arbore[tata].push_back(i + 1);
}
euler[poz] = 1;
heuler[poz++] = 0;
poz_euler[0] = 1;
DFS(1, 1);
for ( i = 2; i < poz; i++ )
logg2[i] = logg2[i / 2] + 1;
for ( i = 1; i < poz; i++ ) {
rmq[i][0] = i;
}
for ( j = 1; j <= logg2[poz - 1]; j++ ) {
for ( i = ( 1 << ( j - 1 ) ) + 1; i <= poz - 1; i++ ) {
if ( heuler[rmq[i - (1 << (j - 1))][j - 1]] < heuler[rmq[i][j - 1]] )
rmq[i][j] = rmq[i - (1 << (j - 1))][j - 1];
else
rmq[i][j] = rmq[i][j - 1];
}
}
for ( i = 1; i <= m; i++ ) {
cin >> a >> b;
poz1 = min ( poz_euler[a], poz_euler[b] );
poz2 = max ( poz_euler[a], poz_euler[b] );
lungime = poz2 - poz1 + 1;
lungime = logg2[lungime];
if ( heuler[rmq[poz1 + ( 1 << lungime ) - 1][lungime]] < heuler[rmq[poz2][lungime]] )
cout << euler[rmq[poz1 + ( 1 << lungime ) - 1][lungime]] << "\n";
else
cout << euler[rmq[poz2][lungime]] << "\n";
}
return 0;
}