#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=200010, L=20, INF=1e18;
int n, q, a[N], l1[L][N], r1[L][N], l2[L][N], r2[L][N], d[N];
int query1(int l, int r) {
int t=31-__builtin_clz(r-l+1);
return max(l1[t][l], r1[t][r]);
}
int query2(int l, int r) {
int t=31-__builtin_clz(r-l+1);
return min(l2[t][l], r2[t][r]);
}
signed main() {
ios_base::sync_with_stdio(0), cin.tie(0);
cin>>n;
for (int i=1; i<=n; i++) cin>>a[i];
a[0]=-INF, a[n+1]=INF;
d[1]=d[n]=a[n]-a[1];
for (int i=1; i<=n; i++) l1[0][i]=r1[0][i]=2*a[i]-a[i-1], l2[0][i]=r2[0][i]=2*a[i]-a[i+1];
for (int i=1; i<L; i++) for (int j=1; j<=n; j++) {
if (j+(1<<i)-1<=n) {
l1[i][j]=max(l1[i-1][j], l1[i-1][j+(1<<(i-1))]);
l2[i][j]=min(l2[i-1][j], l2[i-1][j+(1<<(i-1))]);
}
if (j-(1<<i)+1>=1) {
r1[i][j]=max(r1[i-1][j], r1[i-1][j-(1<<(i-1))]);
r2[i][j]=min(r2[i-1][j], r2[i-1][j-(1<<(i-1))]);
}
}
for (int i=2; i<n; i++) {
int l=i, r=i, t=0;
if (a[i+1]-a[i]<a[i]-a[i-1]) r=i+1, t=1, d[i]=a[i+1]-a[i];
else l=i-1, d[i]=a[i]-a[i-1];
while (1<l || r<n) {
if (t) {
if (l==1) {
d[i]+=a[n]-a[r];
break;
}
int tmp=n;
for (int s=r+1, e=n; s<=e; ) {
int m=(s+e)/2;
if (query2(r, m)<=a[l-1]) tmp=m, e=m-1;
else s=m+1;
}
d[i]+=a[tmp]-a[r]+a[tmp]-a[l-1], r=tmp, l--, t=0;
}
else {
if (r==n) {
d[i]+=a[l]-a[1];
break;
}
int tmp=1;
for (int s=1, e=l-1; s<=e; ) {
int m=(s+e)/2;
if (query1(m, l)>a[r+1]) tmp=m, s=m+1;
else e=m-1;
}
d[i]+=a[l]-a[tmp]+a[r+1]-a[tmp], l=tmp, r++, t=1;
}
}
}
cin>>q;
while (q--) {
int x; cin>>x;
int p=lower_bound(a+1, a+n+1, x)-a;
if (a[p]-x<x-a[p-1]) cout<<d[p]+a[p]-x<<"\n";
else cout<<d[p-1]+x-a[p-1]<<"\n";
}
return 0;
}
# | 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... |