Pagini recente » Monitorul de evaluare | Clasament dupa rating | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #1330275)
#include <fstream>
#include <vector>
using namespace std;
ifstream is("lca.in");
ofstream os("lca.out");
int n, m;
vector<vector<int>> g, r;
vector<int> e, nv, poz, log2;
void Read();
void Df(int nod, int niv);
void RMQ();
void Query();
int main()
{
Read();
Df(1, 1);
RMQ();
Query();
is.close();
os.close();
return 0;
}
void RMQ()
{
log2 = vector<int>(2 * n);
r = vector<vector<int>>(2 * n, vector<int>(20));
for ( int i = 2; i < 2 * n; ++i )
log2[i] = log2[i / 2] + 1;
int N = 2 * n - 1;
for ( int i = 0; i <= N; ++i )
r[i][0] = i;
for ( int j = 1; (1 << j) <= N; ++j )
for ( int i = 1; i + (1 << j) - 1 <= N; ++i )
if ( nv[r[i][j - 1]] < nv[r[i + (1 << (j - 1))][j - 1]] )
r[i][j] = r[i][j - 1];
else
r[i][j] = r[i + (1 << (j - 1))][j - 1];
}
void Df(int nod, int niv)
{
poz[nod] = e.size();
e.push_back(nod);
nv.push_back(niv);
for ( const auto& nodv : g[nod] )
{
Df(nodv, niv + 1);
e.push_back(nod);
nv.push_back(niv);
}
}
void Read()
{
int nod;
is >> n >> m;
g = vector<vector<int>>(n + 1);
poz = vector<int>(n + 1);
e.push_back(0);
nv.push_back(0);
for ( int i = 2; i <= n; ++i )
{
is >> nod;
g[nod].push_back(i);
}
}
void Query()
{
int x, y, val;
while ( m-- )
{
is >> x >> y;
x = poz[x];
y = poz[y];
if ( poz[x] > poz[y] )
swap(x, y);
val = log2[y - x + 1];
if ( nv[r[x][val]] < nv[r[y - (1 << val) + 1][val]] )
os << e[r[x][val]] << "\n";
else
os << e[r[y - (1 << val) + 1][val]] << "\n";
}
}