#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int a[1000005];
int b[1000005];
int c[1000005];
bool check(int k){
memset(c,0,sizeof c);
// long long res;
priority_queue<int> que;
int x=0,y=0;
int j=1;
// cout<<"-----";
for(int i = 1;i <= n;i++){
if(b[j] == i){
x += k;
j++;
que.push(-(i+k));
}while(!que.empty() && (-que.top()) < i){
que.pop();
y--;
}
x-=y;
c[i] += x;
// cout<<x<<" ";
// cout<<y<<" ";
if(b[j-1]==i) y++;
}
// cout<<"\n";
j=m;
x=0;
y=0;
// cout<<"----";
priority_queue<int> q2;
for(int i = n;i >= 1;i--){
if(b[j] == i){
x += k;
// y++;
j--;
q2.push((i-k));
}while(!q2.empty() && (q2.top()) > i){
q2.pop();
y--;
}
x-=y;
c[i]+=x;
// cout<<x<<" ";
if(b[j+1] == i) y++;
}
// cout<<"\n";
for(int i =1;i <= m;i++){
c[b[i]] -= k;
}
// for(int i = 1;i <= n;i++){
// cout<<c[i]<<" ";
// }cout<<endl;
for(int i = 1;i<=n;i++){
if(c[i] < a[i]) {return false;}
}
return true;
}
signed main(){
cin >> n >> m;
for(int i = 1;i <= n;i++){
scanf("%lld",&a[i]);
}for(int i = 1;i <= m;i++){
scanf("%lld",&b[i]);
}sort(b+1,b+1+m);
int l=0,r=1e9,mid;
while(l < r){
mid = (l + r) >> 1;
if(check(mid)){
r = mid;
}else{
l = mid+1;
}
// cout<<l<<"\n";
}
cout<<l;
// cout<<"=----"<<check(2);
return 0;
}
正序枚举遍历每一个点的贡献 倒序也来一次 在容斥原理去掉本身一次
进行二分