Pagini recente » Cod sursa (job #2159014) | Cod sursa (job #688863) | Cod sursa (job #537255) | Cod sursa (job #2815133) | Cod sursa (job #1674737)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <utility>
#include <algorithm>
#include <functional>
#include <string>
#include <cstring>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#define NMAX 100005
#define LOGMAX 18
#define MOD 666013
#define INF 0x3f3f3f3f
#define pb push_back
using namespace std;
typedef pair<int, int> pii;
FILE *fin = fopen("lca.in","r");
FILE *fout = fopen("lca.out","w");
int euler[2*NMAX],height[2*NMAX],firstap[NMAX], nrord, precalclog[NMAX];
int RMQ[LOGMAX][2*NMAX];
vector<int> v[NMAX];
void DFS(int x, int level);
int main() {
int i,n,j,m,x,y,dif,k,ramas,res;
fscanf(fin, "%d%d", &n, &m);
for(i=2;i<=n;++i) {
fscanf(fin, "%d", &x);
v[x].pb(i);
}
DFS(1,0);
for(i=2;i<=nrord;++i)
precalclog[i]=precalclog[i/2]+1;
for(i=1;i<=nrord;++i)
RMQ[0][i]=i;
for(i=1;(1<<i)<=nrord;++i)
for(j=1;j+(1<<i)-1<=nrord;++j)
if(height[RMQ[i-1][j]] < height[RMQ[i-1][j+(1<<(i-1))]])
RMQ[i][j]=RMQ[i-1][j];
else
RMQ[i][j]=RMQ[i-1][j+(1<<(i-1))];
for(i=0;i<m;++i) {
fscanf(fin, "%d%d", &x, &y);
x=firstap[x];
y=firstap[y];
if(x>y) swap(x,y);
dif=y-x+1;
k=precalclog[dif];
ramas=dif-(1<<k);
if(height[RMQ[k][x]] < height[RMQ[k][x+ramas]])
res=RMQ[k][x];
else res=RMQ[k][x+ramas];
fprintf(fout,"%d\n", euler[res]);
}
return 0;
}
void DFS(int x, int level) {
int i;
euler[++nrord]=x;
height[nrord]=level;
firstap[x]=nrord;
for(i=0;i<v[x].size();++i) {
DFS(v[x][i],level+1);
euler[++nrord]=x;
height[nrord]=level;
}
}