Mai intai trebuie sa te autentifici.
Cod sursa(job #739747)
Utilizator | Data | 23 aprilie 2012 20:15:08 | |
---|---|---|---|
Problema | Lowest Common Ancestor | Scor | 40 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.02 kb |
#include<fstream>
#include<vector>
#define MAX 200100
using namespace std;
int n, m, rmq[16][MAX];
int eu[MAX], niv[MAX];
vector<int> g[MAX];
void dfs(int nod){
int i;
eu[++eu[0]]=nod;
niv[nod] = eu[0];
for (i=0; i<(int)g[nod].size(); i++) {
dfs(g[nod][i]);
eu[++eu[0]] = nod;
}
}
void Rmq(){
for (int i=1; i<eu[0]; i++)
rmq[0][i] = eu[i];
for (int i=1; (1<<i)<=eu[0]; i++)
for (int j=1; j<=eu[0]-(1<<i)+1; ++j)
rmq[i][j] = min(rmq[i-1][j], rmq[i-1][j+(1<<(i-1))]);
}
int query(int a, int b){
int x, y, i;
x = niv[a];
y = niv[b];
if (x>y) swap(x, y);
for (i=1; (1<<i)<=(y-x+1); i++);
i--;
return min(rmq[i][x], rmq[i][y-(1<<i)+1]);
}
int main(){
ifstream fin("lca.in");
ofstream fout("lca.out");
fin>>n>>m;
int a, b;
for (int i=2; i<=n; i++){
fin>>a;
g[a].push_back(i);
}
dfs(1);
Rmq();
for (int i=1; i<=m; i++){
fin>>a>>b;
fout<<query(a, b)<<"\n";
}
fin.close();
fout.close();
return 0;
}