#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1e9 + 7;
const long long MOD2 = 998244353;
const long long MOD3 = 1812447359;
const long long INF = 1ll << 62;
const double PI = 2 * asin(1);
void yes() { printf("yes\n"); }
void no() { printf("no\n"); }
void Yes() { printf("Yes\n"); }
void No() { printf("No\n"); }
void YES() { printf("YES\n"); }
void NO() { printf("NO\n"); }
struct SegmentTree {
  vector<int> Tree[21];
  void Make() {
    for (int i = 0; i < 21; i++) {
      Tree[i].resize(1 << i);
    }
  }
  void Add(int num, int val) {
    for (int i = 20; i >= 0; i--) {
      Tree[i][num] += val;
      num /= 2;
    }
  }
  int Search(int num) {
    int now = 0, sum = 0;
    for (int i = 1; i < 21; i++) {
      now *= 2;
      if (sum + Tree[i][now] < num) {
        sum += Tree[i][now];
        now++;
      }
    }
    return now;
  }
};
int main() {
  int N, Q;
  scanf("%d%d", &N, &Q);
  SegmentTree T;
  T.Make();
  for (int i = 0; i < N; i++) {
    int A;
    scanf("%d", &A);
    T.Add(A, 1);
  }
  for (int i = 0; i < Q; i++) {
    int K;
    scanf("%d", &K);
    if (K > 0) {
      T.Add(K, 1);
    } else {
      int num = T.Search(-1 * K);
      T.Add(num, -1);
    }
  }
  for (int i = 0; i <= 1e6; i++) {
    if (T.Tree[20][i] > 0) {
      cout << i << endl;
      return 0;
    }
  }
  cout << 0 << endl;
  return 0;
}
