Pagini recente » Cod sursa (job #3135236) | Cod sursa (job #2539657) | Cod sursa (job #592141) | Cod sursa (job #260528) | Cod sursa (job #2086418)
#include <fstream>
#include <vector>
using namespace std;
int N, M, stramos[30][100010], nivel[100010];
vector <int> G[100010];
void dfs(int nod, int lev) {
nivel[nod] = lev;
for(vector<int>::iterator it = G[nod].begin(); it != G[nod].end(); ++it)
dfs(*it, lev+1);
}
int lca(int x, int y) {
if(nivel[x] < nivel[y])
swap(x, y);
int log1, log2;
for(log1 = 1; (1 << log1) < nivel[x]; ++log1);
for(log2 = 1; (1 << log2) < nivel[y]; ++log2);
for(int k = log1; k >= 0; --k) {
if(nivel[x] - (1 << k) >= nivel[y])
x = stramos[k][x];
}
if(x == y)
return x;
for(int k = log2; k >= 0; --k) {
if(stramos[k][x] && stramos[k][x] != stramos[k][y]) {
x = stramos[k][x];
y = stramos[k][y];
}
}
return stramos[0][x];
}
int main() {
ifstream in ("lca.in");
ofstream out ("lca.out");
in >> N >> M;
for(int i = 2; i <= N; ++i) {
in >> stramos[0][i];
G[stramos[0][i]].push_back(i);
}
int k;
for(k = 1; (1 << k) <= N; ++k) {
for(int i = 1; i <= N; ++i) {
stramos[k][i] = stramos[k-1][stramos[k-1][i]];
}
}
dfs(1, 0);
while(M--) {
int x, y;
in >> x >> y;
out << lca(x, y) << "\n";
}
}