查询时标记点,爆了
#include<iostream>
#include<cmath>
using namespace std;
long long n,m,a[1000005],p[1000005],b[1000005],f1[1000005],f2[1000005],fl,fr;
int pd(int mid){
for (int i=1;i<=n;i++){
f1[i]=0;
f2[i]=0;
p[b[i]]=1;
}
fl=0;fr=0;
for (int i=1;i<=m;i++){
if(b[i]-mid+1>=1) f1[b[i]-mid+1]+=1;
else {
fl+=2-(b[i]-mid+1);
f1[1]++;
}
if(b[i]+mid-1<=n) f2[b[i]+mid-1]=-1;
p[b[i]]=1;
}
long long cnt1=0,cnt2=0,sum=0;
for (int i=1;i<=n;i++){
if(f1[i]>=1) cnt1+=f1[i];
if(f2[i]<=-1) cnt2--;
if(i==1) sum+=fl;
sum+=cnt1;
sum-=cnt2;if(sum<a[i]) return -1;
if(p[i]==1){
cnt2++;
cnt1--;
}
}
return 1;
}
int main(){
cin>>n>>m;
for (int i=1;i<=n;i++)
cin>>a[i];
for (int i=1;i<=m;i++){
cin>>b[i];
}
int ans=0;
long long l=1,r=1000000000+n,mid=(l+r)/2;
while(l<=r){
int k=pd(mid);
if(k==-1) l=mid+1;
if(k==1) {
ans=mid;
r=mid-1;
}
mid=(r+l)/2;
}
cout<<ans;
return 0;
}