#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define vct vector
#define que queue
#define stk stack
#define sct struct
#define str string
#define N 1145141
#define k mid
int n, m;
int a[N];
int b[N];
ll mid;
bool solve() {
vct <ll> p1(N);
vct <ll> p2(N);
for (int i = 1; i <= m; i ++) {
if (b[i] - k + 1 >= 1 && b[i] - k + 1 <= n) p1[b[i] - k + 1] ++;
else p1[1] ++;
if (b[i] + 1 <= n) p1[b[i] + 1] --;
if (b[i] + k - 1 >= 1 && b[i] + k - 1 <= n) {
p2[b[i] + k - 1] ++;
}
else {
p2[n] ++;
}
p2[b[i]] --;
}
for (int i = 1; i <= n; i ++) {
p1[i] = p1[i - 1] + p1[i];
}
for (int i = 1; i <= n; i ++) {
p1[i] = p1[i - 1] + p1[i];
}
for (int i = n; i ; i --) {
p2[i] = p2[i + 1] + p2[i];
}
for (int i = n; i ; i --) {
p2[i] = p2[i + 1] + p2[i];
}
for (int i = 1; i <= n; i ++) {
p1[i] += p2[i];
if (p1[i] < a[i]) {
return 0;
}
}
return 1;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i ++) {
cin >> a[i];
}
for (int i = 1; i <= m; i ++) {
cin >> b[i];
}
ll l = 1;
ll r = 1000000000;
while (l <= r) {
mid = (l + r) / 2;
if (solve()){
if (l == r) {
cout << mid;
return 0;
}
r = mid;
} else {
l = mid + 1;
}
}
}