Pagini recente » Cod sursa (job #714239) | Cod sursa (job #1613247) | Cod sursa (job #1339219) | Cod sursa (job #278044) | Cod sursa (job #2120776)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("lca.in");
ofstream out("lca.out");
const int N = 100002, L = 19;
int eul[2*N], poz[N], lev[2*N], lg[2*N], put[L], rmq[L][2*N], cnt, x, y;
vector <int> v[N];
void DFS(int ns, int h){
int sz = v[ns].size();
eul[++cnt] = ns;
lev[cnt] = h;
poz[ns] = cnt;
for(int i=0;i<sz;i++){
DFS(v[ns][i],h+1);
eul[++cnt] = ns;
lev[cnt] = h;
}
}
void process(){
for(int i=2;i<=cnt;i++)
lg[i] = lg[i/2] + 1;
put[0] = 1;
for(int i=1;i<=L;i++)
put[i] = put[i-1] * 2;
for(int i=1;i<=cnt;i++)
rmq[0][i] = i;
for(int i=1;put[i]<=cnt;i++)
for(int j=1;j<=cnt-put[i]+1;j++){
rmq[i][j] = rmq[i-1][j];
if(lev[rmq[i-1][j+put[i-1]]] < lev[rmq[i][j]])
rmq[i][j] = rmq[i-1][j+put[i-1]];
}
}
int lca(){
int len, log, dist, sol;
x = poz[x];
y = poz[y];
if(x > y)
swap(x,y);
len = y - x + 1;
log = lg[len];
dist = len - put[log];
sol = rmq[log][x];
if(lev[sol] > lev[rmq[log][x+dist]])
sol = rmq[log][x+dist];
return eul[sol];
}
int main()
{
int n,m;
in>>n>>m;
for(int i=2;i<=n;i++){
in>>x;
v[x].push_back(i);
}
DFS(1,0);
process();
for(int i=1;i<=m;i++){
in>>x>>y;
out<<lca()<<"\n";
}
in.close();
out.close();
return 0;
}