#include <bits/stdc++.h>
using namespace std;
int const NMAX=200005;
int const LOG=20;
int n;
int x[NMAX];
void read(){
    cin>>n;
    int i;
    for(i=1;i<=n;++i)
        cin>>x[i];
}
int rmax[NMAX][LOG];
int rmin[NMAX][LOG];
int logr[NMAX];
void precalc_rmq(){
    int i,j;
    for(i=1;i<=n;++i){
        if(2<=i)
            rmax[i][0]=2*x[i]-x[i-1];
        if(i<=n-1)
            rmin[i][0]=2*x[i]-x[i+1];
    }
    for(j=1;j<LOG;++j)
        for(i=1;i<=n-(1<<j)+1;++i){
            rmax[i][j]=max(rmax[i][j-1],rmax[i+(1<<(j-1))][j-1]);
            rmin[i][j]=min(rmin[i][j-1],rmin[i+(1<<(j-1))][j-1]);
        }
    for(i=2;i<NMAX;++i)
        logr[i]=logr[i/2]+1;
}
int range_max(int l,int r){
    int lg=logr[r-l+1];
    return max(rmax[l][lg],rmax[r-(1<<lg)+1][lg]);
}
int range_min(int l,int r){
    int lg=logr[r-l+1];
    return min(rmin[l][lg],rmin[r-(1<<lg)+1][lg]);
}
void drive_left(int& l,int& r,long long& dist);
void drive_right(int& l,int& r,long long& dist);
void drive_left(int& l,int& r,long long& dist){
    if(r==n){
        dist+=x[l]-x[1];
        l=1;
        return;
    }
    if(l==2 || range_max(2,l-1)<=x[r+1]){
        dist+=x[l]-x[1];
        l=1;
        dist+=x[r]-x[l];
        drive_right(l,r,dist);
        return;
    }
    /// [)
    int st=2,dr=l;
    while(dr-st>1){
        int mij=(st+dr)/2;
        if(range_max(mij,l-1)>x[r+1])
            st=mij;
        else
            dr=mij;
    }
    dist+=x[l]-x[st];
    l=st;
    dist+=x[r]-x[l];
    drive_right(l,r,dist);
}
void drive_right(int& l,int& r,long long& dist){
    if(l==1){
        dist+=x[n]-x[r];
        r=n;
        return;
    }
    if(r==n-1 || range_min(r+1,n-1)>x[l-1]){
        dist+=x[n]-x[r];
        r=n;
        dist+=x[r]-x[l];
        drive_left(l,r,dist);
        return;
    }
    /// (]
    int st=r,dr=n-1;
    while(dr-st>1){
        int mij=(st+dr)/2;
        if(range_min(r+1,mij)<=x[l-1])
            dr=mij;
        else
            st=mij;
    }
    dist+=x[dr]-x[r];
    r=dr;
    dist+=x[r]-x[l];
    drive_left(l,r,dist);
}
void process_queries(){
    int q;
    cin>>q;
    while(q--){
        int qx;
        cin>>qx;
        if(qx<=x[1]){
            long long dist=x[1]-qx;
            int l=1,r=1;
            drive_right(l,r,dist);
            cout<<dist<<'\n';
            continue;
        }
        if(x[n]<=qx){
            long long dist=qx-x[n];
            int l=n,r=n;
            drive_left(l,r,dist);
            cout<<dist<<'\n';
            continue;
        }
        int id=upper_bound(x+1,x+n+1,qx)-x;
        if(qx-x[id-1]<=x[id]-qx)
            --id;
        long long dist=abs(qx-x[id]);
        int l=id,r=id;
        if(id==1)
            drive_right(l,r,dist);
        else
            if(id==n)
                drive_left(l,r,dist);
            else
                if(x[id]-x[id-1]<=x[id+1]-x[id])
                    drive_left(l,r,dist);
                else
                    drive_right(l,r,dist);
        cout<<dist<<'\n';
    }
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    read();
    precalc_rmq();
    process_queries();
    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... |