Pagini recente » Cod sursa (job #2192062) | Cod sursa (job #113720) | Cod sursa (job #2543182) | Cod sursa (job #2678310) | Cod sursa (job #377127)
Cod sursa(job #377127)
#include <iostream>
#include <vector>
using namespace std;
vector<int> G[100001];
bool viz[100001];
int H[200002], poz[200002], k, rmq[18][200002], L[200002], lg[200002];
void DFS(int nod, int lev) {
//parcurgere Euler
//nodurile sunt stocate in H[ ] si prima pozitia pe care apar ele in poz[ ]
if(viz[nod]) { return; }
viz[nod]=1;
H[++k]=nod;
L[k]=lev;
poz[nod]=k;
for(vector<int>::iterator it=G[nod].begin(); it!=G[nod].end(); it++) {
DFS(*it, lev+1);
H[++k]=nod;
L[k]=lev;
}
}
int main() {
FILE *f1=fopen("lca.in", "r"), *f2=fopen("lca.out", "w");
int n, m, i, j, p, q, x, y, aux;
int sol;
fscanf(f1, "%d%d", &n, &m);
for(i=2; i<=n; i++) {
fscanf(f1, "%d", &p);
G[p].push_back(i);
}
DFS(1, 0);
lg[1]=0;
for(i=2; i<=k; i++) {
lg[i]=lg[i >> 1] + 1;
}
for(i=1; i<=k; i++) {
rmq[0][i]=i;
}
for(i=1; (1<<i)<k; ++i) {
for(j=1; j<=k-(1 << i); ++j) {
int l = 1 << (i - 1);
rmq[i][j]=rmq[i-1][j];
if(L[rmq[i-1][j+l]]<L[rmq[i][j]]) {
rmq[i][j] = rmq[i-1][j+l];
}
}
}
for(i=1; i<=m; i++) {
fscanf(f1, "%d%d", &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=lg[q-p+1];
aux=q-p+1-(1 << x);
//rmq[x][p], rmq[x][p+aux]
sol=rmq[x][p];
if(L[sol]>L[rmq[x][p+aux]]) {
sol=rmq[x][p+aux];
}
fprintf(f2, "%d\n", H[sol]);
}
fclose(f1); fclose(f2);
return 0;
}