Pagini recente » Cod sursa (job #1918467) | Cod sursa (job #45708) | Cod sursa (job #1334210) | Cod sursa (job #854073) | Cod sursa (job #2727946)
#include <fstream>
#include <vector>
using namespace std;
/// complexitate log + log cu cautarea binara a lui Patrascu, tot 100
const int NMAX = 100000;
const int LOG = 17;
vector<int> graf[1 + NMAX];
int tata[1 + NMAX][LOG];
int adancime[1 + NMAX];
void dfs(int nod, int adanc)
{
adancime[nod] = adanc;
for (int i = 0; i < graf[nod].size(); i++)
{
dfs(graf[nod][i], 1 + adanc);
}
}
int main()
{
ifstream in("lca.in");
ofstream out("lca.out");
int n, m;
in >> n >> m;
for (int i = 2; i <= n; i++)
{
in >> tata[i][0];
graf[tata[i][0]].emplace_back(i);
}
for (int i = 2; i <= n; i++)
{
int nod = tata[i][0];
for (int j = 1; j < LOG; j++)
{
nod = tata[nod][j - 1];
tata[i][j] = nod;
}
}
dfs(1, 1);
for (int j = 1; j <= m; j++)
{
int x, y;
in >> x >> y;
if (adancime[x] < adancime[y])
{
swap(x, y);
}
int difAdancime = adancime[x] - adancime[y];
int exp = 0;
while (difAdancime > 0)
{
if (difAdancime % 2 == 1)
{
x = tata[x][exp];
}
difAdancime /= 2;
exp++;
}
if (x == y)
{
out << x << '\n';
}
else
{
int putere = 1;
int exp = 0;
while (putere <= adancime[x])
{
putere *= 2;
exp++;
}
int pos = 0;
while(putere > 0)
{
if (pos + putere <= adancime[x] && tata[x][exp] != tata[y][exp])
{
x = tata[x][exp];
y = tata[y][exp];
}
putere /= 2;
exp--;
}
out << tata[x][0] << '\n';
}
}
return 0;
}