Pagini recente » Clasament sas | Concursuri Virtuale | Atasamentele paginii preojixxx | pregatire_oji_ms_clasax1 | Cod sursa (job #773670)
Cod sursa(job #773670)
#include <cstdio>
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <ctype.h>
#include <cstring>
#include <ctime>
using namespace std;
#define MAXN 100005
#define MAXM 2000005
vector<int> graph[MAXN];
vector<pair<int, int> > pairs[MAXN];
bool color[MAXN];
int answer[MAXM];
int ancestor[MAXN];
int T[MAXN];
int t, x, y, N, M;
void unite(int x, int y) {
(x + y) & 1 ? T[y] = x : T[x] = y;
}
int find(int x) {
int root = x;
while(T[root] != root)
root = T[root];
while(x != root) {
int y = T[x];
T[x] = root;
x = y;
}
return root;
}
void tarjan(int node) {
ancestor[find(node)] = node;
for(size_t i = 0; i < graph[node].size(); i++) {
int v = graph[node][i];
tarjan(v);
unite(find(node), find(v));
ancestor[find(node)] = node;
}
color[node] = true;
for(vector<pair<int, int> > :: iterator it = pairs[node].begin(); it != pairs[node].end(); it++)
if(color[it->first] == true)
answer[it->second] = ancestor[find(it->first)];
}
int main() {
freopen("lca.in", "r", stdin);
freopen("lca.out","w", stdout);
scanf("%d %d", &N, &M);
for(int i = 2; i <= N; i++) {
scanf("%d", &t);
graph[t].push_back(i);
}
for(int i = 1; i <= N; i++)
T[i] = i;
for(int i = 0; i < M; i++) {
scanf("%d %d", &x, &y);
pairs[x].push_back(make_pair(y, i));
pairs[y].push_back(make_pair(x, i));
}
tarjan(1);
for(int i = 0; i < M; i++)
printf("%d\n", answer[i]);
return 0;
}