#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const double pi = 2 * acos(0.0);
const double eps = 1e-9;
template <class T>
inline T gcd(T a, T b) {
  if (a < 0) return gcd(-a, b);
  if (b < 0) return gcd(a, -b);
  return (b == 0) ? a : gcd(b, a % b);
}
template <class T>
inline T lcm(T a, T b) {
  if (a < 0) return lcm(-a, b);
  if (b < 0) return lcm(a, -b);
  return a * (b / gcd(a, b));
}
struct debugger {
  template <typename T>
  debugger& operator,(const T& v) {
    cerr << v << " ";
    return *this;
  }
} dbg;
int data[1000005];
int tree[1000005];
int n, q, x, k;
int query(int idx) {
  int sum = 0;
  while (idx > 0) {
    sum += tree[idx];
    idx -= idx & (-idx);
  }
  return sum;
}
void update(int idx, int x) {
  while (idx <= n) {
    tree[idx] += x;
    idx += idx & (-idx);
  }
}
int main() {
  scanf("%d %d", &n, &q);
  for (int i = 0; i < n; i++) {
    scanf("%d", &x);
    update(x, 1);
  }
  for (int i = 0; i < q; i++) {
    scanf("%d", &k);
    if (k < 0) {
      int id = ((k) < 0 ? -(k) : (k));
      int low = 0;
      int high = n;
      int ans;
      while (low <= high) {
        int mid = (low + high) / 2;
        if (query(mid) >= id) {
          ans = mid;
          high = mid - 1;
        } else {
          low = mid + 1;
        }
      }
      update(ans, -1);
    } else
      update(k, 1);
  }
  bool flag = true;
  for (int i = 1; i <= n; i++) {
    if (query(i) > 0) {
      printf("%d\n", i);
      flag = false;
      break;
    }
  }
  if (flag) printf("0\n");
}
