func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 150000;   const int L = 19;   vector<int> edges[N];   long long x[N], y[N];   int anc[N][L], tin[N], tout[N], s[N], moment;   void dfs(int x, int last) {     tin[x] = ++moment;     anc[x][0] = last;     for (int i = 1; i < L; i++) anc[x][i] = anc[anc[x][i - 1]][i - 1];     for (int i = 0; i < edges[x].size(); i++)       if (edges[x][i] != last) dfs(edges[x][i], x);     tout[x] = ++moment;   }   long long coef(int i, int j, int k) {     long long a = y[i] - y[j], b = x[j] - x[i], c = x[i] * y[j] - x[j] * y[i];     return (a * x[k] + b * y[k] + c);   }   bool father(int x, int y) { return (tin[x] <= tin[y] && tout[y] <= tout[x]); }   int lca(int a, int b) {     if (father(a, b)) return a;     if (father(b, a)) return b;     for (int i = L - 1; i >= 0; i--)       if (!father(anc[a][i], b)) a = anc[a][i];     return anc[a][0];   }   int main() {     int n;     scanf( %d , &n);     for (int i = 1; i <= n; i++) scanf( %I64d %I64d , &x[i], &y[i]);     int cnt = 1;     s[cnt] = n;     for (int i = n - 1; i >= 1; i--) {       s[++cnt] = i;       while (cnt > 2 && coef(s[cnt], s[cnt - 2], s[cnt - 1]) < 0)         swap(s[cnt - 1], s[cnt]), cnt--;       edges[s[cnt]].push_back(s[cnt - 1]);       edges[s[cnt - 1]].push_back(s[cnt]);     }     moment = 0, dfs(n, n);     int quests;     scanf( %d , &quests);     for (int i = 1; i <= quests; i++) {       int x, y;       scanf( %d %d , &x, &y);       printf( %d  , lca(x, y));     }     return 0;   }   