Pagini recente » Cod sursa (job #2290249) | Cod sursa (job #1013013) | Cod sursa (job #1399054) | Cod sursa (job #585971) | Cod sursa (job #2964359)
#include <fstream>
#include <vector>
using namespace std;
#define MAXN 100005
#define LOG_MAXN 20
struct node {
int depth;
int par[LOG_MAXN];
vector <int> chd;
};
node tree[MAXN];
void Init(int pos) {
int i;
for ( i = 1; tree[pos].par[i - 1] != -1 && i < LOG_MAXN; i++ )
tree[pos].par[i] = tree[tree[pos].par[i - 1]].par[i - 1];
tree[pos].par[i] = -1;
if(tree[pos].par[0] == -1) {
tree[pos].depth = 0;
}
else {
tree[pos].depth = tree[tree[pos].par[0]].depth + 1;
}
for ( int i = 0; i < tree[pos].chd.size (); i++ ){
if ( tree[pos].chd[i] == tree[pos].par[0] )
continue;
Init ( tree[pos].chd[i] );
}
}
int LCA(int pos1, int pos2) {
if ( tree[pos1].depth > tree[pos2].depth )
swap ( pos1, pos2 );
for ( int bit = LOG_MAXN - 1; bit >= 0; bit--) {
if ( ( ( tree[pos2].depth - tree[pos1].depth ) & (1 << bit) ) != 0) {
pos2 = tree[pos2].par[bit];
}
}
if(pos1 == pos2) {
return pos1;
}
for ( int bit = LOG_MAXN - 1; bit >= 0; bit-- ){
if ( tree[pos2].par[bit] != tree[pos1].par[bit] ){
pos1 = tree[pos1].par[bit];
pos2 = tree[pos2].par[bit];
}
}
return tree[pos1].par[0];
}
int main() {
ifstream fin("lca.in");
ofstream fout("lca.out");
int n, q;
int pos1, pos2;
fin >> n >> q;
tree[0].par[0] = -1;
for(int i = 1; i < n; i++) {
fin >> tree[i].par[0];
tree[i].par[0]--;
tree[tree[i].par[0]].chd.push_back(i);
}
Init(0);
for(int i = 0; i < q; i++) {
fin >> pos1 >> pos2;
pos1--;
pos2--;
fout << LCA(pos1, pos2) + 1 << '\n';
}
}