Pagini recente » Cod sursa (job #2553736) | Cod sursa (job #88384) | Cod sursa (job #42505) | Cod sursa (job #1399925) | Cod sursa (job #2467102)
#include <fstream>
#include <vector>
#include <math.h>
using namespace std;
ifstream fin ("lca.in");
ofstream fout ("lca.out");
void dfs ( int nod );
struct A
{
int val, poz;
};
vector < int > fii[100001];
vector < A > rmq[18];
int n, m, j, k, x, Lg, b, c;
int t[100001], a[200001], lvl[100001], prim[100001];
void afisare();
int main()
{
int i;
fin >> n >> m;
for ( i = 2 ; i <= n ; i++ )
{
fin >> t[i];
fii[t[i]].push_back ( i );
}
dfs ( 1 );
Lg = j;
x = log2 ( Lg );
for ( i = 1 ; i <= Lg ; i++ ) rmq[0].push_back ( { lvl[i], a[i] } );
for ( i = 1 ; i <= x ; i++ )
for ( j = 0 ; j < Lg - ( 1 << i ) + 1 ; j++ )
{
if ( rmq[i-1][j].val <= rmq[i-1][j+(1<<(i-1))].val ) rmq[i].push_back ( { rmq[i-1][j].val, rmq[i-1][j].poz } );
else rmq[i].push_back ( { rmq[i-1][j+(1<<(i-1))].val, rmq[i-1][j+(1<<(i-1))].poz } );
}
//afisare();
for ( i = 1 ; i <= m ; i++ )
{
fin >> b >> c;
if ( prim[b] > prim[c] ) swap ( b, c );
x = log2 ( prim[c] - prim[b] + 1 );
if ( rmq[x-1][prim[b]-1].val <= rmq[x-1][prim[c]-(1<<x)].val ) fout << rmq[x-1][prim[b]-1].poz << ' ';
else fout << rmq[x-1][prim[c]-(1<<x)].poz << ' ';
}
return 0;
}
void dfs ( int nod )
{
int i;
for ( i = 0 ; i < fii[nod].size() ; i++ )
{
a[++j] = nod;
lvl[j] = k;
if ( prim[nod] == 0 ) prim[nod] = j;
k++;
dfs ( fii[nod][i] );
k--;
}
a[++j] = nod;
lvl[j] = k;
if ( prim[nod] == 0 ) prim[nod] = j;
}
void afisare()
{
int i;
fout << " a : ";
for ( i = 1 ; i <= Lg ; i++ ) fout << a[i] << " ";
fout << '\n';
fout << "lvl : ";
for ( i = 1 ; i <= Lg ; i++ ) fout << lvl[i] << " ";
fout << '\n' << '\n';
fout << "prim: ";
for ( i = 1 ; i <= n ; i++ ) fout << prim[i] << " ";
fout << '\n' << '\n';
fout << "Matricea pentru rmq : " << '\n';
for ( i = 0 ; i <= x; i++ )
{
for ( j = 0 ; j < rmq[i].size() ; j++ ) fout << rmq[i][j].val << ' ';
fout << '\n';
}
fout << '\n' << '\n';
}