拍了一下午没拍出来555
#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define fi first
#define se second
const int N=6000005;
int n,s,p[N],nx[N],f[N];
pii t[N<<2];
pii merge(pii a,pii b)
{
pii c;
if(a.fi==-1)return b;
else if(b.fi==-1)return a;
else if(!a.fi||!b.fi)c={0,0};
else c={max(a.fi,b.fi),min(a.se,b.se)};
if(c.fi>c.se)c.fi=c.se=0;
return c;
}
void ins(int x,pii v,int p=1,int l=1,int r=2*n)
{
if(l==r){t[p]=v;return;}
int mid=l+r>>1;
if(x<=mid)ins(x,v,p<<1,l,mid);
else ins(x,v,p<<1|1,mid+1,r);
t[p]=merge(t[p<<1],t[p<<1|1]);
}
pii qus(int L,int R,int p=1,int l=1,int r=2*n)
{
if(L<=l&&r<=R)return t[p];
int mid=l+r>>1;
if(L<=mid&&R>mid)return merge(qus(L,R,p<<1,l,mid),qus(L,R,p<<1|1,mid+1,r));
else if(L<=mid)return qus(L,R,p<<1,l,mid);
else return qus(L,R,p<<1|1,mid+1,r);
}
int fd(int L,int s,pii &v,int p=1,int l=1,int r=2*n)
{
if(L<=l)
{
pii c=merge(t[p],v);
if(c.fi<=s&&s<=c.se){v=c;return 0;}
if(l==r)return l;
int mid=l+r>>1,res=0;
res=fd(L,s,v,p<<1,l,mid);
if(res)return res;
return fd(L,s,v,p<<1|1,mid+1,r);
}
int mid=l+r>>1,res=0;
if(L<=mid)res=fd(L,s,v,p<<1,l,mid);
if(res)return res;
return fd(L,s,v,p<<1|1,mid+1,r);
}
pii gt(int x,int y)
{
int mid=x+y>>1;
if(x>y)
{
return {1,mid+(x+y&1)-1};
}
else
{
return {mid+1,n};
}
}
int main()
{
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>s;long long ans=0;
nx[0]=1;f[2*n+1]=2*n;
for(int i=1;i<=n;++i)
{
cin>>p[i];p[i+n]=p[i];f[i]=i-1;nx[i]=i+1;f[i+n]=i+n-1;nx[i+n]=i+n+1;
}
for(int i=1;i<2*n;++i)
{
ins(i,gt(p[i],p[i+1]));
}
ins(2*n,{-1,0});
for(int i=1,pos=1;i<n;++i)
{
// int l=pos+1,r=pos+n;
// while(l<r)
// {
// int mid=l+r>>1;
// pii v=qus(pos,mid-1);
// if(v.fi<=s&&s<=v.se)l=mid+1;
// else r=mid;
// }
// l--;
pii v={1,n};
int l=fd(pos,s,v);
if(l>n)l-=n;
ans+=abs(s-p[l]);
// cout<<l<<" "<<s<<" "<<p[l]<<" "<<ans<<"\n";
s=p[l];
ins(l,{-1,0}),ins(l+n,{-1,0});
nx[f[l]]=nx[l];f[nx[l]]=f[l];
nx[f[l+n]]=nx[l+n];f[nx[l+n]]=f[l+n];
if(i==n-1)continue;
if(f[l]&&nx[l])ins(f[l],gt(p[f[l]],p[nx[l]]));
else if(f[l])ins(f[l],{-1,0});
if(f[l+n]&&nx[l+n])ins(f[l+n],gt(p[f[l+n]],p[nx[l+n]]));
else if(f[l+n])ins(f[l+n],{-1,0});
pos=nx[l];if(pos>n)pos-=n;
}
ans+=abs(s-p[nx[0]]);
cout<<ans;
return 0;
}