Pagini recente » Cod sursa (job #460849) | Cod sursa (job #993604) | Cod sursa (job #3356041) | Cod sursa (job #3344159) | Cod sursa (job #3328265)
#include <fstream>
#include <vector>
#include <unordered_map>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
struct Node{
int val;
vector <Node*> children;
Node(int data)
{
val = data;
}
};
const int NMAX = 1e5;
vector <Node*> tree(NMAX+5);
vector <int> idx(2*NMAX+5), lg(2*NMAX+5);
vector<vector<pair<int,int>>> rmq(20, vector<pair<int,int>>(2*NMAX + 5));
unordered_map <int, int> mp(NMAX + 5);
int cnt;
void euler(Node* node, int level)
{
rmq[1][++cnt].first = node->val;
rmq[1][cnt].second = level;
mp[node->val] = cnt;
for(auto& child: node->children)
{
euler(child, level + 1);
rmq[1][++cnt].first = node->val;
rmq[1][cnt].second = level;
}
}
int main()
{
int n, m, x, y;
fin >> n >> m;
for(int i = 1; i <= n; ++i)
tree[i] = new Node(i);
for(int i = 2; i <= n; ++i)
{
fin >> x;
tree[x]->children.push_back(tree[i]);
}
euler(tree[1], 0);
for(int i = 1; i <= cnt; ++i)
lg[i] = lg[i/2] + 1;
for(int k = 2; (1 << k) <= cnt; ++k)
{
for(int i = 1; i + (1<<k) <= cnt; ++i)
{
x = rmq[k-1][i].second;
y = rmq[k-1][i + (1<<(k-1))].second;
if(x < y)
rmq[k][i] = rmq[k-1][i];
else
rmq[k][i] = rmq[k-1][i + (1<<(k-1))];
}
}
for(int i = 1; i <= m; ++i)
{
fin >> x >> y;
x = mp[x];
y = mp[y];
if(x > y)
swap(x,y);
int t = lg[y - x + 1] - 1;
int minim;
int a, b;
a = rmq[t][x].second;
b = rmq[t][y - (1 << t) + 1].second;
if(a < b)
fout << rmq[t][x].first << "\n";
else
fout << rmq[t][y - (1 << t) + 1].first << "\n";
}
return 0;
}