#include <bits/stdc++.h>
using namespace std;
const long long llmax = 9223372036854775807;
const long long llmin = -9223372036854775808;
const int intmin = -2147483648;
const int intmax = 2147483647;
const int mod = 1e9 + 7;
long long gcd(long long a, long long b) {
  if (a == 0 || b == 0)
    return a + b;
  else
    return gcd(b, a % b);
}
template <typename A, typename B>
inline A fexp(A x, B p) {
  A ans = 1;
  for (; p; p >>= 1, x = 1LL * x * x % mod)
    if (p & 1) ans = 1LL * ans * x % mod;
  return ans;
}
template <typename T>
inline void read(T &x) {
  x = 0;
  T f = 1;
  char ch;
  do {
    ch = getchar();
    if (ch == '-') f = -1;
  } while (ch < '0' || ch > '9');
  do x = x * 10 + ch - '0', ch = getchar();
  while (ch <= '9' && ch >= '0');
  x *= f;
}
vector<long long> primes;
template <class T>
bool isPrime(T x) {
  if (x <= 4 || x % 2 == 0 || x % 3 == 0) return x == 2 || x == 3;
  for (T i = 5; i * i <= x; i += 6)
    if (x % i == 0 || x % (i + 2) == 0) return 0;
  return 1;
}
int Tcnt = 0;
template <class TT>
class ST {
  struct Node {
    int l, r;
    set<int> unq;
    set<int> rep;
  };
  vector<TT> A;
  vector<Node> T;

 public:
  ST(vector<TT> &AA) {
    A.emplace_back(0);
    for (int i = 0; i < AA.size(); i++) A.emplace_back(AA[i]);
    T.resize(A.size() << 2);
    build(1, 1, (int)A.size() - 1);
  }
  int QueryUnq(int l, int r) { return (int)queryUnq(1, l, r).first.size(); }

 private:
  void pushup(int i) {
    T[i].unq = T[i << 1].unq;
    T[i].rep = T[i << 1].rep;
    for (auto v : T[i << 1 | 1].rep) T[i].rep.emplace(v);
    for (auto v : T[i << 1 | 1].unq) {
      if (T[i].unq.find(v) == T[i].unq.end() &&
          T[i].rep.find(v) == T[i].rep.end())
        T[i].unq.emplace(v);
      else
        T[i].unq.erase(v), T[i].rep.emplace(v);
    }
    for (auto v : T[i].rep)
      if (T[i].unq.find(v) != T[i].unq.end()) T[i].unq.erase(v);
  }
  void build(int i, int l, int r) {
    T[i].l = l;
    T[i].r = r;
    if (l == r) {
      T[i].unq.emplace(A[l]);
      return;
    }
    int M = l + r >> 1;
    build(i << 1, l, M);
    build(i << 1 | 1, M + 1, r);
    pushup(i);
  }
  pair<set<int>, set<int>> queryUnq(int i, int l, int r) {
    if (l <= T[i].l && T[i].r <= r) return make_pair(T[i].unq, T[i].rep);
    int M = T[i].l + T[i].r >> 1;
    set<int> ans;
    set<int> rep;
    if (l <= M) {
      pair<set<int>, set<int>> tmp = queryUnq(i << 1, l, r);
      ans = tmp.first;
      rep = tmp.second;
    }
    if (r > M) {
      pair<set<int>, set<int>> tmp = queryUnq(i << 1 | 1, l, r);
      for (auto &v : tmp.second) rep.emplace(v);
      for (auto &v : tmp.first) {
        if (ans.find(v) == ans.end() && rep.find(v) == rep.end())
          ans.emplace(v);
        else
          ans.erase(v), rep.emplace(v);
      }
      for (auto &v : rep)
        if (ans.find(v) != ans.end()) ans.erase(v);
    }
    return make_pair(ans, rep);
  }
};
struct less_than_key {
  inline bool operator()(const string &struct1, const string &struct2) {
    return (struct1.size() > struct2.size());
  }
};
long long func(long long n, long long m, long long r, long long x,
               long long y) {
  long long val =
      (min(n + 1, x + r) - max(x, r)) * (min(m + 1, y + r) - max(y, r));
  return val;
}
bool isPrime(long long x) {
  if (x <= 4 || x % 2 == 0 || x % 3 == 0) return x == 2 || x == 3;
  for (long long i = 5; i * i <= x; i += 6)
    if (x % i == 0 || x % (i + 2) == 0) return 0;
  return 1;
}
template <typename T>
vector<int> suffix_array(int n, const T &s, int char_bound) {
  vector<int> a(n);
  if (n == 0) {
    return a;
  }
  if (char_bound != -1) {
    vector<int> aux(char_bound, 0);
    for (int i = 0; i < n; i++) {
      aux[s[i]]++;
    }
    int sum = 0;
    for (int i = 0; i < char_bound; i++) {
      int add = aux[i];
      aux[i] = sum;
      sum += add;
    }
    for (int i = 0; i < n; i++) {
      a[aux[s[i]]++] = i;
    }
  } else {
    iota(a.begin(), a.end(), 0);
    sort(a.begin(), a.end(), [&s](int i, int j) { return s[i] < s[j]; });
  }
  vector<int> sorted_by_second(n);
  vector<int> ptr_group(n);
  vector<int> new_group(n);
  vector<int> group(n);
  group[a[0]] = 0;
  for (int i = 1; i < n; i++) {
    group[a[i]] = group[a[i - 1]] + (!(s[a[i]] == s[a[i - 1]]));
  }
  int cnt = group[a[n - 1]] + 1;
  int step = 1;
  while (cnt < n) {
    int at = 0;
    for (int i = n - step; i < n; i++) {
      sorted_by_second[at++] = i;
    }
    for (int i = 0; i < n; i++) {
      if (a[i] - step >= 0) {
        sorted_by_second[at++] = a[i] - step;
      }
    }
    for (int i = n - 1; i >= 0; i--) {
      ptr_group[group[a[i]]] = i;
    }
    for (int i = 0; i < n; i++) {
      int x = sorted_by_second[i];
      a[ptr_group[group[x]]++] = x;
    }
    new_group[a[0]] = 0;
    for (int i = 1; i < n; i++) {
      if (group[a[i]] != group[a[i - 1]]) {
        new_group[a[i]] = new_group[a[i - 1]] + 1;
      } else {
        int pre = (a[i - 1] + step >= n ? -1 : group[a[i - 1] + step]);
        int cur = (a[i] + step >= n ? -1 : group[a[i] + step]);
        new_group[a[i]] = new_group[a[i - 1]] + (pre != cur);
      }
    }
    swap(group, new_group);
    cnt = group[a[n - 1]] + 1;
    step <<= 1;
  }
  return a;
}
template <typename T>
vector<int> suffix_array(const T &s, int char_bound) {
  return suffix_array((int)s.size(), s, char_bound);
}
template <typename T>
vector<int> build_lcp(int n, const T &s, const vector<int> &sa) {
  assert((int)sa.size() == n);
  vector<int> pos(n);
  for (int i = 0; i < n; i++) {
    pos[sa[i]] = i;
  }
  vector<int> lcp(max(n - 1, 0));
  int k = 0;
  for (int i = 0; i < n; i++) {
    k = max(k - 1, 0);
    if (pos[i] == n - 1) {
      k = 0;
    } else {
      int j = sa[pos[i] + 1];
      while (i + k < n && j + k < n && s[i + k] == s[j + k]) {
        k++;
      }
      lcp[pos[i]] = k;
    }
  }
  return lcp;
}
template <typename T>
vector<int> build_lcp(const T &s, const vector<int> &sa) {
  return build_lcp((int)s.size(), s, sa);
}
int cnts[26];
int dp[200001];
int main() {
  std::cin.sync_with_stdio(false);
  std::cin.tie(nullptr);
  bool test = false;
  if (test) freopen("/Users/aj/code/HackerRank/input.txt", "r", stdin);
  int a, b;
  cin >> a >> b;
  int st = 0, trn = 1;
  while (true) {
    ++st;
    if (trn % 2 == 1)
      a -= st;
    else
      b -= st;
    if (a < 0) {
      cout << "Vladik";
      return 0;
    }
    if (b < 0) {
      cout << "Valera";
      return 0;
    }
    trn++;
  }
  return 0;
}

### Prompt

Create a solution in cpp for the following problem:

At regular competition Vladik and Valera won a and b candies respectively. Vladik offered 1 his candy to Valera. After that Valera gave Vladik 2 his candies, so that no one thought that he was less generous. Vladik for same reason gave 3 candies to Valera in next turn.

More formally, the guys take turns giving each other one candy more than they received in the previous turn.

This continued until the moment when one of them couldn’t give the right amount of candy. Candies, which guys got from each other, they don’t consider as their own. You need to know, who is the first who can’t give the right amount of candy.

Input

Single line of input data contains two space-separated integers a, b (1 ≤ a, b ≤ 109) — number of Vladik and Valera candies respectively.

Output

Pring a single line "Vladik’’ in case, if Vladik first who can’t give right amount of candy, or "Valera’’ otherwise.

Examples

Input

1 1


Output

Valera


Input

7 6


Output

Vladik

Note

Illustration for first test case:

<image>

Illustration for second test case:

<image>

### Response

```cpp
#include <bits/stdc++.h>
using namespace std;
const long long llmax = 9223372036854775807;
const long long llmin = -9223372036854775808;
const int intmin = -2147483648;
const int intmax = 2147483647;
const int mod = 1e9 + 7;
long long gcd(long long a, long long b) {
  if (a == 0 || b == 0)
    return a + b;
  else
    return gcd(b, a % b);
}
template <typename A, typename B>
inline A fexp(A x, B p) {
  A ans = 1;
  for (; p; p >>= 1, x = 1LL * x * x % mod)
    if (p & 1) ans = 1LL * ans * x % mod;
  return ans;
}
template <typename T>
inline void read(T &x) {
  x = 0;
  T f = 1;
  char ch;
  do {
    ch = getchar();
    if (ch == '-') f = -1;
  } while (ch < '0' || ch > '9');
  do x = x * 10 + ch - '0', ch = getchar();
  while (ch <= '9' && ch >= '0');
  x *= f;
}
vector<long long> primes;
template <class T>
bool isPrime(T x) {
  if (x <= 4 || x % 2 == 0 || x % 3 == 0) return x == 2 || x == 3;
  for (T i = 5; i * i <= x; i += 6)
    if (x % i == 0 || x % (i + 2) == 0) return 0;
  return 1;
}
int Tcnt = 0;
template <class TT>
class ST {
  struct Node {
    int l, r;
    set<int> unq;
    set<int> rep;
  };
  vector<TT> A;
  vector<Node> T;

 public:
  ST(vector<TT> &AA) {
    A.emplace_back(0);
    for (int i = 0; i < AA.size(); i++) A.emplace_back(AA[i]);
    T.resize(A.size() << 2);
    build(1, 1, (int)A.size() - 1);
  }
  int QueryUnq(int l, int r) { return (int)queryUnq(1, l, r).first.size(); }

 private:
  void pushup(int i) {
    T[i].unq = T[i << 1].unq;
    T[i].rep = T[i << 1].rep;
    for (auto v : T[i << 1 | 1].rep) T[i].rep.emplace(v);
    for (auto v : T[i << 1 | 1].unq) {
      if (T[i].unq.find(v) == T[i].unq.end() &&
          T[i].rep.find(v) == T[i].rep.end())
        T[i].unq.emplace(v);
      else
        T[i].unq.erase(v), T[i].rep.emplace(v);
    }
    for (auto v : T[i].rep)
      if (T[i].unq.find(v) != T[i].unq.end()) T[i].unq.erase(v);
  }
  void build(int i, int l, int r) {
    T[i].l = l;
    T[i].r = r;
    if (l == r) {
      T[i].unq.emplace(A[l]);
      return;
    }
    int M = l + r >> 1;
    build(i << 1, l, M);
    build(i << 1 | 1, M + 1, r);
    pushup(i);
  }
  pair<set<int>, set<int>> queryUnq(int i, int l, int r) {
    if (l <= T[i].l && T[i].r <= r) return make_pair(T[i].unq, T[i].rep);
    int M = T[i].l + T[i].r >> 1;
    set<int> ans;
    set<int> rep;
    if (l <= M) {
      pair<set<int>, set<int>> tmp = queryUnq(i << 1, l, r);
      ans = tmp.first;
      rep = tmp.second;
    }
    if (r > M) {
      pair<set<int>, set<int>> tmp = queryUnq(i << 1 | 1, l, r);
      for (auto &v : tmp.second) rep.emplace(v);
      for (auto &v : tmp.first) {
        if (ans.find(v) == ans.end() && rep.find(v) == rep.end())
          ans.emplace(v);
        else
          ans.erase(v), rep.emplace(v);
      }
      for (auto &v : rep)
        if (ans.find(v) != ans.end()) ans.erase(v);
    }
    return make_pair(ans, rep);
  }
};
struct less_than_key {
  inline bool operator()(const string &struct1, const string &struct2) {
    return (struct1.size() > struct2.size());
  }
};
long long func(long long n, long long m, long long r, long long x,
               long long y) {
  long long val =
      (min(n + 1, x + r) - max(x, r)) * (min(m + 1, y + r) - max(y, r));
  return val;
}
bool isPrime(long long x) {
  if (x <= 4 || x % 2 == 0 || x % 3 == 0) return x == 2 || x == 3;
  for (long long i = 5; i * i <= x; i += 6)
    if (x % i == 0 || x % (i + 2) == 0) return 0;
  return 1;
}
template <typename T>
vector<int> suffix_array(int n, const T &s, int char_bound) {
  vector<int> a(n);
  if (n == 0) {
    return a;
  }
  if (char_bound != -1) {
    vector<int> aux(char_bound, 0);
    for (int i = 0; i < n; i++) {
      aux[s[i]]++;
    }
    int sum = 0;
    for (int i = 0; i < char_bound; i++) {
      int add = aux[i];
      aux[i] = sum;
      sum += add;
    }
    for (int i = 0; i < n; i++) {
      a[aux[s[i]]++] = i;
    }
  } else {
    iota(a.begin(), a.end(), 0);
    sort(a.begin(), a.end(), [&s](int i, int j) { return s[i] < s[j]; });
  }
  vector<int> sorted_by_second(n);
  vector<int> ptr_group(n);
  vector<int> new_group(n);
  vector<int> group(n);
  group[a[0]] = 0;
  for (int i = 1; i < n; i++) {
    group[a[i]] = group[a[i - 1]] + (!(s[a[i]] == s[a[i - 1]]));
  }
  int cnt = group[a[n - 1]] + 1;
  int step = 1;
  while (cnt < n) {
    int at = 0;
    for (int i = n - step; i < n; i++) {
      sorted_by_second[at++] = i;
    }
    for (int i = 0; i < n; i++) {
      if (a[i] - step >= 0) {
        sorted_by_second[at++] = a[i] - step;
      }
    }
    for (int i = n - 1; i >= 0; i--) {
      ptr_group[group[a[i]]] = i;
    }
    for (int i = 0; i < n; i++) {
      int x = sorted_by_second[i];
      a[ptr_group[group[x]]++] = x;
    }
    new_group[a[0]] = 0;
    for (int i = 1; i < n; i++) {
      if (group[a[i]] != group[a[i - 1]]) {
        new_group[a[i]] = new_group[a[i - 1]] + 1;
      } else {
        int pre = (a[i - 1] + step >= n ? -1 : group[a[i - 1] + step]);
        int cur = (a[i] + step >= n ? -1 : group[a[i] + step]);
        new_group[a[i]] = new_group[a[i - 1]] + (pre != cur);
      }
    }
    swap(group, new_group);
    cnt = group[a[n - 1]] + 1;
    step <<= 1;
  }
  return a;
}
template <typename T>
vector<int> suffix_array(const T &s, int char_bound) {
  return suffix_array((int)s.size(), s, char_bound);
}
template <typename T>
vector<int> build_lcp(int n, const T &s, const vector<int> &sa) {
  assert((int)sa.size() == n);
  vector<int> pos(n);
  for (int i = 0; i < n; i++) {
    pos[sa[i]] = i;
  }
  vector<int> lcp(max(n - 1, 0));
  int k = 0;
  for (int i = 0; i < n; i++) {
    k = max(k - 1, 0);
    if (pos[i] == n - 1) {
      k = 0;
    } else {
      int j = sa[pos[i] + 1];
      while (i + k < n && j + k < n && s[i + k] == s[j + k]) {
        k++;
      }
      lcp[pos[i]] = k;
    }
  }
  return lcp;
}
template <typename T>
vector<int> build_lcp(const T &s, const vector<int> &sa) {
  return build_lcp((int)s.size(), s, sa);
}
int cnts[26];
int dp[200001];
int main() {
  std::cin.sync_with_stdio(false);
  std::cin.tie(nullptr);
  bool test = false;
  if (test) freopen("/Users/aj/code/HackerRank/input.txt", "r", stdin);
  int a, b;
  cin >> a >> b;
  int st = 0, trn = 1;
  while (true) {
    ++st;
    if (trn % 2 == 1)
      a -= st;
    else
      b -= st;
    if (a < 0) {
      cout << "Vladik";
      return 0;
    }
    if (b < 0) {
      cout << "Valera";
      return 0;
    }
    trn++;
  }
  return 0;
}

```