Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- vector <vector<int>> graf;
- vector<int> height, order, pos, tree;
- vector<bool> used;
- void dfs(int v, int h)
- {
- used[v] = true;
- height[v] = h;
- order.push_back(v);
- for (int i = 0; i != graf[v].size(); i++) {
- if (!used[graf[v][i]])
- {
- dfs(graf[v][i], h + 1);
- order.push_back(v);
- }
- }
- }
- void createTree(int i, int l, int r)
- {
- if (l == r) {
- tree[i] = order[l];
- }
- else{
- int m = (l + r) / 2;//
- createTree(i + i, l, m);
- createTree(i + i + 1, m + 1, r);
- tree[i] = height[tree[i + i]] < height[tree[i + i + 1]] ? tree[i + i] : tree[i + i + 1];
- }
- }
- int min(int i, int sl, int sr, int l, int r)
- {
- if (sl == l && sr == r) {
- return tree[i];
- }
- int sm = (sl + sr) >> 1;
- if (r <= sm) {
- return min(i + i, sl, sm, l, r);
- }
- if (l > sm) {
- return min(i + i + 1, sm + 1, sr, l, r);
- }
- int ans1 = min(i + i, sl, sm, l, sm);
- int ans2 = min(i + i + 1, sm + 1, sr, sm + 1, r);
- return height[ans1] < height[ans2] ? ans1 : ans2;
- }
- int main()
- {
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- int n;
- cin >> n;
- graf.resize(n);
- int a, b;
- for (int i = 0; i < n - 1; i++) {
- cin >> a;
- cin >> b;
- graf[a - 1].push_back(b - 1);
- graf[b - 1].push_back(a - 1);
- }
- height.resize(n);//
- used.resize(n);
- dfs(0, 1);
- tree.assign(order.size() * 4 + 1, -1);
- createTree(1, 0, order.size() - 1);
- pos.assign(n, -1);
- for (int i = 0; i < order.size(); ++i)
- {
- if (pos[order[i]] == -1) {
- pos[order[i]] = i;
- }
- }
- cin >> a;
- cin >> b;
- while (a != -1) {
- int left = pos[a - 1],
- right = pos[b - 1];
- if (left > right) { swap(left, right); }
- cout << min(1, 0, order.size() - 1, left, right) + 1 << endl;
- a = -1;
- cin >> a;
- cin >> b;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement