Pagini recente » Cod sursa (job #205370) | Cod sursa (job #2800866) | Cod sursa (job #2302914) | Cod sursa (job #197007) | Cod sursa (job #739831)
Cod sursa(job #739831)
#include <fstream>
#include <vector>
using namespace std;
ifstream f ("lca.in");
ofstream g ("lca.out");
#define DIM 2000010
int n,m,rmq[20][DIM];
int ve[DIM],lvl[DIM];
vector<int> a[DIM];
void dfs(int);
void RMQ();
int query(int, int);
int main(){
int b,c,i;
f>>n>>m;
for(i=2;i<=n;++i){
f>>b;
a[b].push_back(i);
}
dfs(1);
RMQ();
for(i=1;i<=m;++i){
f>>b>>c;
g<<query(b,c)<<"\n";
}
f.close();
g.close();
return 0;
}
void dfs(int nod){
int i;
ve[++ve[0]]=nod;
lvl[nod]=ve[0];
for(i=0;i<(int)a[nod].size();++i){
dfs(a[nod][i]);
ve[++ve[0]] = nod;
}
}
void RMQ(){
int i,j;
for(i=1;i<ve[0];++i)
rmq[0][i] = ve[i];
for(i=1;(1<<i)<=ve[0];++i)
for(j=1;j<=ve[0]-(1<<i)+1;++j)
rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);
}
int query(int b, int c){
int x,y,i;
x=lvl[b];
y=lvl[c];
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]);
}