Hiking club "Up the hill" just returned from a walk. Now they are trying to remember which hills they've just walked through.

It is known that there were N stops, all on different integer heights between 1 and N kilometers (inclusive) above the sea level. On the first day they've traveled from the first stop to the second stop, on the second day they've traveled from the second to the third and so on, and on the last day they've traveled from the stop N - 1 to the stop N and successfully finished their expedition.

They are trying to find out which heights were their stops located at. They have an entry in a travel journal specifying how many days did they travel up the hill, and how many days did they walk down the hill.

Help them by suggesting some possible stop heights satisfying numbers from the travel journal.

Input

In the first line there is an integer non-negative number A denoting the number of days of climbing up the hill. Second line contains an integer non-negative number B — the number of days of walking down the hill (A + B + 1 = N, 1 ≤ N ≤ 100 000).

Output

Output N space-separated distinct integers from 1 to N inclusive, denoting possible heights of the stops in order of visiting.

Examples

Input

0
1


Output

2 1 


Input

2
1

Output

1 3 4 2
#include <bits/stdc++.h>
using namespace std;
long long countBits(long long n) {
  long long cnt = 0;
  while (n) {
    cnt++;
    n >>= 1;
  }
  return cnt;
}
long long power(long long a, long long n, long long d) {
  long long res = 1;
  while (n) {
    if (n & 1 != 0) {
      res = ((res % d) * ((a % d + d) % d)) % d;
      n--;
    } else {
      a = ((((a % d + d) % d)) * (((a % d + d) % d))) % d;
      n >>= 1;
    }
  }
  return res;
}
void SieveOfEratosthenes(long long N, vector<long long>& s) {
  s[0] = 0;
  s[1] = 0;
  s[2] = 1;
  s[3] = 1;
  bool prime[N + 1];
  memset(prime, true, sizeof(prime));
  for (long long p = 2; p * p <= N; p++) {
    if (prime[p] == true) {
      for (long long i = p * p; i <= N; i += p) {
        prime[i] = false;
        s[i] = 0;
      }
    }
  }
}
struct not_digit {
  bool operator()(const char c) { return c != ' ' && !std::isdigit(c); }
};
void extractNum(string str, vector<long long>& numbers) {
  not_digit not_a_digit;
  string::iterator end = std::remove_if(str.begin(), str.end(), not_a_digit);
  string all_numbers(str.begin(), end);
  stringstream second(all_numbers);
  for (long long i = 0; second >> i;) {
    numbers.push_back(i);
  }
}
void getWords(string str, vector<string>& vec, unordered_set<string>& Set) {
  string word;
  stringstream iss(str);
  while (iss >> word) {
    Set.insert(word);
    vec.push_back(word);
  }
}
bool isPower(long long n) {
  if (n <= 1) return true;
  for (long long x = 2; x <= sqrt(n); x++) {
    unsigned p = x;
    while (p <= n) {
      p *= x;
      if (p == n) return true;
    }
  }
  return false;
}
string decimalToBinary(long long n) {
  string s = bitset<64>(n).to_string();
  const auto loc1 = s.find('1');
  if (loc1 != string::npos) return s.substr(loc1);
  return "0";
}
double slope(long long x1, long long y1, long long x2, long long y2) {
  double angle;
  angle = (y2 - y1) / (double)(x2 - x1);
  return angle;
}
bool isPrime(long long n) {
  if (n == 1)
    return false;
  else {
    for (long long i = 2; i * i <= n; i++) {
      if (n % i == 0) return false;
    }
    return true;
  }
}
long long Power(long long a, long long n) {
  long long res = 1;
  if (n == 0) return 1;
  while (n) {
    if (n & 1 != 0) {
      res *= a;
      n--;
    } else {
      a *= a;
      n >>= 1;
    }
  }
  return res;
}
long long Mod(long long x) {
  return ((x % 1000000007 + 1000000007) % 1000000007);
}
long long add(long long a, long long b) { return Mod(Mod(a) + Mod(b)); }
long long mul(long long a, long long b) { return Mod(Mod(a) * Mod(b)); }
const long long N = 2e5 + 2;
long long fact[N];
void precalc() {
  fact[0] = 1;
  for (long long i = 1; i < N; i++) {
    fact[i] = mul(fact[i - 1], i);
  }
}
long long inv(long long x) { return pow(x, 1000000007 - 2); }
long long divide(long long a, long long b) { return mul(a, inv(b)); }
long long nCr(long long n, long long r) {
  return divide(fact[n], mul(fact[r], fact[n - r]));
}
bool isPalindrome(string s) {
  long long i, len = s.size();
  for (i = 0; i < len / 2; i++) {
    if (s[i] != s[len - i - 1]) return 0;
  }
  return 1;
}
void primeFactors(long long n, vector<long long>& vec) {
  while (n % 2 == 0) {
    vec.push_back(2);
    n = n / 2;
  }
  for (long long i = 3; i <= sqrt(n); i = i + 2) {
    while (n % i == 0) {
      vec.push_back(i);
      n = n / i;
    }
  }
  if (n > 2) vec.push_back(n);
}
void solve() {
  long long a, b, i;
  cin >> a >> b;
  if (a == 0) {
    for (i = b + 1; i >= 1; i--) cout << i << " ";
    cout << endl;
  } else if (b == 0) {
    for (i = 1; i <= a + 1; i++) cout << i << " ";
    cout << endl;
  } else if (a >= b) {
    for (i = b + 1; i <= a + b + 1; i++) cout << i << " ";
    for (i = b; i >= 1; i--) cout << i << " ";
    cout << endl;
  } else if (a < b) {
    for (i = b + 1; i <= a + b + 1; i++) cout << i << " ";
    for (i = b; i >= 1; i--) cout << i << " ";
    cout << endl;
  }
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  solve();
}
