Pagini recente » Cod sursa (job #752167) | Cod sursa (job #1330159) | Cod sursa (job #1804301) | Cod sursa (job #1113403) | Cod sursa (job #1261283)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
#define Nmax 100001
#define LOG 18
vector< int > G[Nmax];
vector< bool > viz(Nmax);
int S[Nmax], vf;
int h[Nmax];
int v[2 * Nmax], poz[Nmax];
int RMQ[LOG][2 * Nmax], log[2 * Nmax];
int main()
{
int i, a, b, q, n, nr = 0, d;
bool ok;
fin >> n >> q;
for(i = 2; i <= n; ++i)
{
fin >> a;
G[a].push_back(i);
}
// parcurgere DFS
S[0] = 1; vf = 0; viz[1] = 1; h[1] = 0;
while(vf >= 0)
{
a = S[vf]; ok = 0;
v[++nr] = a;
if(!poz[a]) poz[a] = nr;
for(auto it = G[a].begin(); it != G[a].end() && !ok; ++it)
if(!viz[*it])
{
S[++vf] = (*it);
h[*it] = 1 + h[a];
ok = 1;
viz[*it] = 1;
}
if(!ok) S[vf--] = 0;
}
// preprocess
for(i = 1; i <= nr; ++i) RMQ[0][i] = v[i];
for(d = 1; (1 << d) <= nr; ++d)
{
for(i = 1; i + (1 << d) - 1 <= nr; ++i)
RMQ[d][i] = (h[RMQ[d-1][i]] < h[RMQ[d-1][i + (1 << (d-1))]] ?
RMQ[d-1][i] : RMQ[d-1][i + (1 << (d-1))]);
}
for(log[1] = 0, i = 2; i <= nr; ++i) log[i] = 1 + log[i >> 1];
//solve
for(i = 1; i <= q; ++i)
{
fin >> a >> b;
if(a == b)
{
fout << a << '\n';
continue;
}
if(poz[a] > poz[b]) swap(a, b);
d = log[poz[b] - poz[a] + 1];
fout << (h[ RMQ[d][poz[a]] ] < h[ RMQ[d][poz[b] - (1 << d) + 1] ] ?
RMQ[d][poz[a]] : RMQ[d][poz[b] - (1 << d) + 1]) << '\n';
}
return 0;
}