Pagini recente » Cod sursa (job #2081541) | Cod sursa (job #2848205) | Cod sursa (job #2172370) | Cod sursa (job #605252) | Cod sursa (job #377100)
Cod sursa(job #377100)
#include <iostream>
#include <fstream>
#include <vector>
#include <math.h>
using namespace std;
vector<int> G[100001];
int H[100001], poz[100001], k=0, rmq[20][100001];
void DFS(int nod) {
H[++k]=nod;
poz[nod]=k;
for(vector<int>::iterator it=G[nod].begin(); it!=G[nod].end(); it++) {
DFS(*it);
H[++k]=nod;
}
}
int min(int a, int b){
if(a<b) { return a; }
return b;
}
int main() {
fstream f1, f2;
int n, m, i, j, p, q, x, y, aux;
f1.open("lca.in", ios::in);
f1>>n>>m;
for(i=2; i<=n; i++) {
f1>>p;
G[p].push_back(i);
}
DFS(1);
for(i=1; i<=k; i++) {
rmq[0][i]=H[i];
}
for(i=1; i<20; i++) {
for(j=1; j<=k-pow(2,i)+1; j++) {
rmq[i][j]=min(rmq[i-1][j], rmq[i-1][j+(int)pow(2,i-1)]);
}
}
f2.open("lca.out", ios::out);
for(i=1; i<=m; i++) {
f1>>p>>q;
//returneaza minimul secventei dintre poz[p], poz[q];
p=poz[p]; q=poz[q];
if(p>q) { swap(p, q); }
//(int)(floor(log2((double)(n))));
x=(int)(floor(log2((double)(q-p+1))));
aux=q-p+1-(int)pow(2, x);
//rmq[x][p], rmq[x][p+aux]
f2<<min(rmq[x][p], rmq[x][p+aux])<<endl;
}
f1.close(); f2.close();
return 0;
}