Pagini recente » Cod sursa (job #2873980) | Cod sursa (job #221186) | Cod sursa (job #3196088) | Cod sursa (job #2666696) | Cod sursa (job #532162)
Cod sursa(job #532162)
#include <fstream>
#include <vector>
using namespace std;
#define NMAX 100001
#define LOGMAX 20
int N, M, I;
ifstream f("lca.in"); ofstream g("lca.out");
int euler[NMAX<<1], depths[NMAX<<1], seen_first[NMAX], mins[LOGMAX][NMAX<<2];
vector<int> tree[NMAX];
void euler_traversal(int nod, int level) {
euler[++I] = nod;
depths[I] = level;
seen_first[nod] = I;
for (vector<int>::iterator it = tree[nod].begin();it!=tree[nod].end();it++) {
euler_traversal(*it,level+1);
euler[++I] = nod;
depths[I] = level;
}
}
void preprocess() {
int i,j;
for (i=1;i<=I;i++) mins[0][i] = i;
for (j=1;(j<<1)<=I;j++)
for (i=1;i+(1<<(j-1))-1<=I;i++)
if (depths[mins[j-1][i]]<depths[mins[j-1][i+(1<<(j-1))]]) mins[j][i] = mins[j-1][i];
else mins[j][i] = mins[j-1][i+(1<<(j-1))];
}
int main() {
int i,j,x,k,dif,a,b;
f>>N>>M;
for (i=2;i<=N;i++) {
f>>x;
tree[x].push_back(i);
}
euler_traversal(1,0);
preprocess();
for (x=1;x<=M;x++) {
f>>a>>b;
i = seen_first[a]; j = seen_first[b];
if (i>j) swap(i,j);
dif = j-i+1, k=0;
for (k=0;dif;dif>>=1,k++); k--;
if (depths[mins[k][i]] < depths[mins[k][j-(1<<k)+1]]) g<<euler[mins[k][i]]<<"\n";
else g<<euler[mins[k][j-(1<<k)+1]]<<"\n";
}
f.close(); g.close(); return 0;
}