This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "bits/stdc++.h"
#define int long long
using namespace std;
struct segtree_partial {
  vector<int> st;
  int stok;
  void u(int l, int r, int tar, int idx, int val) {
    if(l == r) {
      st[idx] = val;
      return;
    }
    int mid = (l+r) >> 1;
    if(tar <= mid) u(l, mid, tar, 2*idx+1, val);
    else u(mid+1, r, tar, 2*idx+2, val);
    st[idx] = max(st[2*idx+1], st[2*idx+2]);
  }
  int qu1(int l, int r, int constl, int constr, int idx, int val) { // Last element in [l, r] > v
    if(l <= constl && constr <= r) {
      if(st[idx] <= val) return -1;
      while(constl < constr) {
        int mid = (constl + constr) >> 1;
        if(st[2*idx+2] > val) idx = 2*idx+2, constl = mid+1;
        else idx = 2*idx+1, constr = mid;
      }
      return constl;
    }
    int mid = (constl + constr) >> 1;
    if(mid < l || r < constl) return qu1(l, r, mid+1, constr, 2*idx+2, val);
    else if(constr < l || r < mid+1) return qu1(l, r, constl, mid, 2*idx+1, val);
    else {
      int rchi = qu1(l, r, mid+1, constr, 2*idx+2, val);
      if(rchi != -1) return rchi;
      return qu1(l, r, constl, mid, 2*idx+1, val);
    }
  }
  int qu2(int l, int r, int constl, int constr, int idx, int val) { // First element in [l, r] > v
    if(l <= constl && constr <= r) {
      if(st[idx] <= val) return -1;
      while(constl < constr) {
        int mid = (constl + constr) >> 1;
        if(st[2*idx+1] > val) idx = 2*idx+1, constr = mid;
        else idx = 2*idx+2, constl = mid+1;
      }
      return constl;
    }
    int mid = (constl + constr) >> 1;
    if(mid < l || r < constl) return qu2(l, r, mid+1, constr, 2*idx+2, val);
    else if(constr < l || r < mid+1) return qu2(l, r, constl, mid, 2*idx+1, val);
    else {
      int lchi = qu2(l, r, constl, mid, 2*idx+1, val);
      if(lchi != -1) return lchi;
      return qu2(l, r, mid+1, constr, 2*idx+2, val);
    }
  }
  void resize(int k) {
    stok = k;
    st.resize(4*k + 10);
  }
  void upd(int i, int v) { u(0, stok, i, 0, v); }
  int last_greater(int l, int r, int v) { return qu1(l, r, 0, stok, 0, v); }
  int first_greater(int l, int r, int v) { return qu2(l, r, 0, stok, 0, v); }
};
int32_t main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n;
  cin >> n;
  int x[n+1];
  for(int i=1; i<=n; i++) cin >> x[i];
  segtree_partial y, z;
  y.resize(n);
  z.resize(n);
  for(int i=2; i<=n; i++) y.upd(i, 2*x[i]-x[i-1]);
  for(int i=1; i<n; i++) z.upd(i, x[i+1]-2*x[i]);
  int q;
  cin >> q;
  while(q--) {
    int s;
    cin >> s;
    int ll=1, rr=n;
    while(ll<rr) {
      int mid = (ll+rr+1)>>1;
      if(x[mid] <= s) ll=mid;
      else rr=mid-1;
    }
    int ans = 0;
    int cur; 
    int mn = 1e18;
    for(int i=max(1ll, ll-2); i<=min(n, ll+2); i++) {
      if(abs(x[i] - s) < mn) {
        mn = abs(x[i] - s);
        cur = i;
      }
    }
    ans += abs(x[cur] - s);
    int l=cur, r=cur;
    while(l!=1 || r!=n) {
      if(l == 1) {
        ans += x[n] - x[cur];
        break;
      }
      else if(r == n) {
        ans += x[cur] - x[1];
        break;
      }
      else if(l == cur) {
        int i = y.last_greater(2, l, x[r+1]);
        if(i != -1) {
          ans += x[cur] - x[i];
          ans += x[r+1] - x[i];
          r++;
          l = i;
          cur = r;
        }
        else {
          ans += x[cur] - x[1];
          ans += x[n] - x[1];
          break;
        }
      }
      else {
        int i = z.first_greater(r, n-1, -x[l-1] - 1);
        if(i != -1) {
          ans += x[i] - x[cur];
          ans += x[i] - x[l-1];
          l--;
          r = i;
          cur = l;
        }
        else {
          ans += x[n] - x[cur];
          ans += x[n] - x[1];
          break;
        }
      }
    }
    cout << ans << "\n";
  }
}
Compilation message (stderr)
travel.cpp: In function 'int32_t main()':
travel.cpp:102:12: warning: 'cur' may be used uninitialized in this function [-Wmaybe-uninitialized]
  102 |       else if(r == n) {
      |            ^~| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |