Pagini recente » Cod sursa (job #2477988) | Cod sursa (job #854465) | Cod sursa (job #1590638) | Cod sursa (job #1468890) | Cod sursa (job #795099)
Cod sursa(job #795099)
#include <fstream>
#include <vector>
using namespace std;
const int N = 100005, M = 2000005;
struct Pmd{
int T[N], D[N], S[N];
Pmd(){
for (int i = 1 ; i < N ; i++){
T[i] = S[i] = i;
D[i] = 1;
}
}
int tata(int x){
if (T[x] == x)
return x;
return T[x] = tata(T[x]);
}
void merge(int x, int y){
x = tata(x);
y = tata(y);
if (x == y)
return;
if (D[x] > D[y])
T[y] = x;
if (D[x] < D[y])
T[x] = y;
if (D[x] == D[y]){
T[y] = x;
D[x]++;
}
S[y] = S[x];
}
int lca(int x){
return S[tata(x)];
}
};
Pmd P;
bool use[N];
vector<int> query[N], graph[N];
int ans[M], nrQ;
ifstream in("lca.in");
ofstream out("lca.out");
struct Query{
int x, y, index;
Query(){
x = y = index = 0;
}
Query(int _x, int _y, int _index){
x = _x;
y = _y;
index = _index;
}
void get(int i){
in >> x >> y;
index = i;
}
bool completed(){
return use[x] && use[y];
}
int get_ans(int X){
return X == x ? P.lca(y) : P.lca(x);
}
} Q[M];
void dfs(int x){
use[x] = true;
for (vector<int> :: iterator it = query[x].begin() ; it != query[x].end() ; it++)
if (Q[*it].completed())
ans[*it] = Q[*it].get_ans(x);
for (vector<int> :: iterator it = graph[x].begin() ; it != graph[x].end() ; it++){
dfs(*it);
P.merge(x, *it);
}
}
int main(){
int n, x;
in >> n >> nrQ;
for (int i = 2 ; i <= n ; i++){
in >> x;
graph[x].push_back(i);
}
for (int i = 1 ; i <= nrQ ; i++){
Q[i].get(i);
query[ Q[i].x ].push_back(i);
query[ Q[i].y ].push_back(i);
}
dfs(1);
for (int i = 1 ; i <= nrQ ; i++)
out << ans[i] << "\n";
return 0;
}