Pagini recente » Cod sursa (job #244987) | Cod sursa (job #2103015) | Cod sursa (job #1791285) | Cod sursa (job #654042) | Cod sursa (job #1490261)
#include <vector>
#include <map>
#include <fstream>
#include <cstring>
using namespace std;
int i = 0, root = 1;
const int lg = 31;
const int o = 200000 + 20;
vector<int> Nout[100010];
int e[o], d[o], h[o], c[lg][o],v[o];
void euler(int& current, int dist, int& i){
e[i] = current;
d[i] = dist;
if (h[current] == -1)h[current] = i;
for (auto& k : Nout[current]){
++i;
euler(k, dist + 1, i);
++i;
e[i] = current;
d[i] = dist;
}
}
void rmq2(){
int j, N = i;
for (i = 0; i < N; ++i)
c[0][i] = i;
for (j = 1; 1 << j <= N; ++j)
for (i = 0; i + (1 << j) - 1 < N; ++i)
if (d[c[j - 1][i]] < d[c[j - 1][i + (1 << (j - 1))]])
c[j][i] = c[j-1][i];
else
c[j][i] = c[j - 1][i + (1 << (j - 1))];
}
int lca(int a, int b){
int p1 = h[a], p2 = h[b];
if (p2 < p1){
p1 ^= p2; p2 = p1^p2; p1 ^= p2;
}
int k = 0, pow = 1;
while (pow <= p2 - p1 + 1){ pow <<= 1; ++k; }
pow >>= 1;
--k;
int index = d[c[k][p1]] <= d[c[k][p2 - pow + 1]] ? c[k][p1] : c[k][p2 - pow + 1];
return e[index];
}
int main(){
ifstream f("lca.in");
ofstream g("lca.out");
int n, m, x;
memset(h, -1, sizeof(h));
f >> n >> m;
for (int i = 2; i <= n; ++i){
f >> x;
Nout[x].push_back(i);
}
i = 0;
euler(root, 0, i);
rmq2();
for (int i = 0; i < m; ++i){
f >> n >> x;
g << lca(n, x) << "\n";
}
return 0;
}