Pagini recente » Cod sursa (job #5255) | Cod sursa (job #2533018) | Cod sursa (job #1850982) | Cod sursa (job #204357) | Cod sursa (job #2565435)
#include <bits/stdc++.h>
#define DIMN 100010
using namespace std;
int elem;
int rmq[20][2*DIMN] , eul[2*DIMN] , first[DIMN] , nv[2*DIMN] , logg[2*DIMN];
vector <int> v[DIMN];
void dfs (int nod , int lvl){
int i , vecin;
eul[++elem] = nod;
first[nod] = elem;
nv[elem] = lvl;
for (i=0;i<v[nod].size();i++){
vecin = v[nod][i];
dfs(vecin , lvl + 1);
eul[++elem] = nod;
nv[elem] = lvl;
}
}
int query (int x, int y){
int px , py , len;
px = first[x];
py = first[y];
if (px > py)
swap(px , py);
len = py - px + 1;
len = logg[len]; /// cea mai mare p2 <= len
if (nv[ rmq[len][px] ] < nv[ rmq[len][py - (1 << len) + 1] ])
return rmq[len][px];
else return rmq[len][py - (1 << len) + 1];
}
int main()
{
FILE *fin = fopen ("lca.in","r");
FILE *fout = fopen ("lca.out","w");
int n , q , x , i , powe , y;
fscanf (fin,"%d%d",&n,&q);
for (i=2;i<=n;i++){
fscanf (fin,"%d",&x);
v[x].push_back(i);
}
dfs (1 , 1);
for (i = 2 ; i <= 2 * n ; i++)
logg[i] = 1 + logg[i / 2];
for (i = 1 ; i <= elem ; i++)
rmq[0][i] = i;
for (powe = 1 ; (1 << powe) <= elem ; powe++){
for (i = 1 ; i + (1 << powe) - 1 <= elem ; i++){
if (nv[ rmq[powe-1][i] ] < nv[ rmq[powe-1][i + (1 << (powe - 1) )] ])
rmq[powe][i] = rmq[powe-1][i];
else rmq[powe][i] = rmq[powe-1][i + (1 << (powe - 1) )];
}
}
/// am fc rmq - ul , e ok sa faci query
for (;q;q--){
fscanf (fin,"%d%d",&x,&y);
fprintf (fout,"%d\n" , eul[ query(x , y) ]);
}
return 0;
}