#include <bits/stdc++.h>
using namespace std;
const int MAXN = 262'144;
struct segr {
	vector<int> val;
	segr(): val(MAXN<<1,0) {}
	void up(int x, int u) {val[x+MAXN] = u;}
	void build() {
		for(int i=MAXN;--i;)
			val[i] = max(val[i<<1],val[i<<1|1]);
	}
	int qry(int x, int t) {
		for(x+=MAXN;x;x>>=1)
			if((x&1) && val[--x] > t) {
				while(x<MAXN)
					x = x << 1 | (val[x<<1|1] > t);
				return x-MAXN;
			}
		return -1;
	}
};
struct segl {
	vector<int> val;
	segl(): val(MAXN<<1,0) {}
	void up(int x, int u) {val[x+MAXN] = u;}
	void build() {
		for(int i=MAXN;--i;)
			val[i] = min(val[i<<1],val[i<<1|1]);
	}
	int qry(int x, int t) {
		for(x+=MAXN;x;x>>=1) {
			if((x&1) && val[x++] <= t) {
				x--;
				while(x<MAXN)
					x = x << 1 | (val[x<<1] > t);
				return x-MAXN;
			}
		}
		return -1;
	}
};
int main() {
	int n;
	cin >> n;
	int x[n];
	for(int i=0;i<n;i++)
		cin >> x[i];
	segr refr;
	refr.up(0,2.1e9);
	for(int i=1;i<n;i++)
		refr.up(i, 2 * x[i] - x[i-1]);
	refr.build();
	segl refl;
	refl.up(n-1,-1.1e9);
	for(int i=0;i<n-2;i++)
		refl.up(i, 2 * x[i] - x[i+1]);
	refl.build();
	int q;
	cin >> q;
	while(q--) {
		int s;
		cin >> s;
		long long ans = 0;
		auto it = lower_bound(x,x+n,s);
		int l, r;
		if(it==x||(it!=x+n&&(*it)-s<s-(*(it-1))))
			l = r = it - x;
		else
			l = r = it - x - 1;
		while(1) {
			int nwl = refr.qry(l+1,r==n-1?2e9:x[r+1]);
			ans += abs(x[l] - x[nwl]);
			l = nwl;
			if(l == 0 && r == n - 1)
				break;
			ans += abs(x[++r] - x[nwl]);
			int nwr = refl.qry(r,l==0?-1e9:x[l-1]);
			ans += abs(x[r] - x[nwr]);
			r = nwr;
			if(l == 0 && r == n - 1)
				break;
			ans += abs(x[nwr] - x[--l]);
		}
		cout << ans << "\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... |