Pagini recente » Cod sursa (job #1503867) | Cod sursa (job #2813428) | Cod sursa (job #3126532) | Cod sursa (job #1465437) | Cod sursa (job #1468339)
#include <fstream>
#include <vector>
using namespace std;
const int MAX = 100001, MAXX = 200001;
int poz[MAX], n, m, niv[MAX], eul[20][MAXX], ne, lg[MAXX];
vector <int> arb[MAX];
ifstream fin("lca.in");
ofstream fout("lca.out");
void dfs(int nod, int lvl){
eul[0][++ne] = nod;
niv[nod] = lvl;
poz[nod] = ne;
for(unsigned i=0; i<arb[nod].size(); i++){
dfs(arb[nod][i], lvl+1);
eul[0][++ne] = nod;
}
}
void builrmq(){
for(int i=1; i<=lg[ne]; i++)
for(int j=1; j<=ne+1-(1<<i); j++)
niv[eul[i-1][j]]<niv[eul[i-1][j+(1<<(i-1))]]?eul[i][j] = eul[i-1][j]:eul[i][j] = eul[i-1][j+(1<<(i-1))];
}
int main()
{
fin>>n>>m;
for(int i=2; i<=n; i++){
int x;
fin>>x;
arb[x].push_back(i);
}
dfs(1, 0);
for(int i=2; i<=ne; i++) lg[i] = 1 + lg[i/2];
builrmq();
for(int i=1; i<=m; i++){
int x, y;
fin>>x>>y;
if(poz[x]>poz[y]){
int aux = x;
x = y;
y = aux;
}
int lin = lg[poz[y]-poz[x]+1];
if(niv[eul[lin][poz[x]]]<niv[eul[lin][poz[y]+1-(1<<lin)]])
fout<<eul[lin][poz[x]]<<'\n';
else
fout<<eul[lin][poz[y]+1-(1<<lin)]<<'\n';
}
return 0;
}