#include <bits/stdc++.h>
using namespace std;
const int INF = 2e9;
const long long LINF = 2e16;
const int magic = 348;
const int MOD = 1e9 + 7;
const double eps = 1e-14;
const double pi = acos(-1);
template <typename T>
inline void Get(T &first) {
  bool f;
  char ch;
  T res;
  while (!isdigit(ch = getchar()) && ch != '-') {
  }
  if (ch == '-')
    f = false, res = 0;
  else
    f = true, res = ch - '0';
  while (isdigit(ch = getchar())) res = res * 10 + ch - '0';
  first = (f ? res : (-res));
}
template <typename T1, typename... T2>
inline void Get(T1 &first, T2 &...second) {
  Get(first);
  Get(second...);
}
struct fastio {
  static const int S = 1e7;
  char rbuf[S + 48], wbuf[S + 48];
  int rpos, wpos, len;
  fastio() { rpos = len = wpos = 0; }
  inline char Getchar() {
    if (rpos == len) rpos = 0, len = fread(rbuf, 1, S, stdin);
    if (!len) return EOF;
    return rbuf[rpos++];
  }
  template <class T>
  inline void Get(T &first) {
    char ch;
    bool f;
    T res;
    while (!isdigit(ch = Getchar()) && ch != '-') {
    }
    if (ch == '-')
      f = false, res = 0;
    else
      f = true, res = ch - '0';
    while (isdigit(ch = Getchar())) res = res * 10 + ch - '0';
    first = (f ? res : -res);
  }
  template <typename T1, typename... T2>
  inline void Get(T1 &first, T2 &...second) {
    Get(first);
    Get(second...);
  }
  inline void getstring(char *s) {
    char ch;
    while ((ch = Getchar()) <= 32) {
    }
    for (; ch > 32; ch = Getchar()) *s++ = ch;
    *s = '\0';
  }
  inline void flush() {
    fwrite(wbuf, 1, wpos, stdout);
    fflush(stdout);
    wpos = 0;
  }
  inline void Writechar(char ch) {
    if (wpos == S) flush();
    wbuf[wpos++] = ch;
  }
  template <class T>
  inline void Print(T first, char ch) {
    char s[20];
    int pt = 0;
    if (first == 0)
      s[++pt] = '0';
    else {
      if (first < 0) Writechar('-'), first = -first;
      while (first) s[++pt] = '0' + first % 10, first /= 10;
    }
    while (pt) Writechar(s[pt--]);
    Writechar(ch);
  }
  inline void printstring(char *s) {
    int pt = 1;
    while (s[pt] != '\0') Writechar(s[pt++]);
  }
} io;
template <typename T>
inline void check_max(T &first, T cmp) {
  first = max(first, cmp);
}
template <typename T>
inline void check_min(T &first, T cmp) {
  first = min(first, cmp);
}
template <typename T>
inline T myabs(T first) {
  return first >= 0 ? first : -first;
}
template <typename T>
inline T gcd(T first, T second) {
  return second == 0 ? first : gcd(second, first % second);
}
inline int add(int first) {
  if (first >= MOD) first -= MOD;
  return first;
}
inline int add(int first, int MO) {
  if (first >= MO) first -= MO;
  return first;
}
inline int sub(int first) {
  if (first < 0) first += MOD;
  return first;
}
inline int sub(int first, int MO) {
  if (first < 0) first += MO;
  return first;
}
inline void Add(int &first, int second) { first = add(first + second); }
inline void Add(int &first, int second, int MO) {
  first = add(first + second, MO);
}
inline void Sub(int &first, int second) { first = sub(first - second); }
inline void Sub(int &first, int second, int MO) {
  first = sub(first - second, MO);
}
template <typename T>
inline int quick_pow(int first, T second) {
  int res = 1;
  while (second) {
    if (second & 1) res = 1ll * res * first % MOD;
    first = 1ll * first * first % MOD;
    second >>= 1;
  }
  return res;
}
template <typename T>
inline int quick_pow(int first, T second, int MO) {
  int res = 1;
  while (second) {
    if (second & 1) res = 1ll * res * first % MO;
    first = 1ll * first * first % MO;
    second >>= 1;
  }
  return res;
}
const int MAXN = 1e5;
int n;
inline bool islarger(double first, double second) {
  return first - second > eps;
}
inline bool issmaller(double first, double second) {
  return first - second < -eps;
}
inline bool isequal(double first, double second) {
  return !islarger(first, second) && !issmaller(first, second);
}
struct Vector {
  double first, second;
  Vector() {}
  inline Vector(double _x, double _y) {
    first = _x;
    second = _y;
  }
  inline Vector operator+(Vector other) {
    return Vector(first + other.first, second + other.second);
  }
  inline Vector operator-(Vector other) {
    return Vector(first - other.first, second - other.second);
  }
  inline bool operator<(const Vector &other) const {
    if (!isequal(first, other.first)) return issmaller(first, other.first);
    return islarger(second, other.second);
  }
  inline void print() { cout << int(first) << ' ' << int(second) << endl; }
} a[MAXN + 48];
int atot;
inline double query_k(Vector first, Vector second) {
  if (isequal(first.first, second.first))
    return islarger(second.second, first.second) ? double(LINF) : double(-LINF);
  return (second.second - first.second) / (second.first - first.first);
}
Vector conv[MAXN + 48];
int tot = 0;
inline void convex_hull() {
  for (register int i = 1; i <= n; i++) {
    if (atot && isequal(a[atot].first, a[i].first)) continue;
    a[++atot] = a[i];
  }
  for (register int i = 1; i <= atot; i++) {
    while (tot >= 2 && !islarger(query_k(conv[tot - 1], conv[tot]),
                                 query_k(conv[tot], a[i])))
      tot--;
    conv[++tot] = a[i];
  }
}
int main() {
  Get(n);
  for (register int i = 1; i <= n; i++)
    Get(a[i].first, a[i].second), a[i].second -= a[i].first * a[i].first;
  sort(a + 1, a + n + 1);
  convex_hull();
  printf("%d\n", tot - 1);
  io.flush();
  return 0;
}

### Prompt

Construct a Cpp code solution to the problem outlined:

Recently Vasya learned that, given two points with different x coordinates, you can draw through them exactly one parabola with equation of type y = x^2 + bx + c, where b and c are reals. Let's call such a parabola an U-shaped one.

Vasya drew several distinct points with integer coordinates on a plane and then drew an U-shaped parabola through each pair of the points that have different x coordinates. The picture became somewhat messy, but Vasya still wants to count how many of the parabolas drawn don't have any drawn point inside their internal area. Help Vasya.

The internal area of an U-shaped parabola is the part of the plane that lies strictly above the parabola when the y axis is directed upwards.

Input

The first line contains a single integer n (1 ≤ n ≤ 100 000) — the number of points.

The next n lines describe the points, the i-th of them contains two integers x_i and y_i — the coordinates of the i-th point. It is guaranteed that all points are distinct and that the coordinates do not exceed 10^6 by absolute value.

Output

In the only line print a single integer — the number of U-shaped parabolas that pass through at least two of the given points and do not contain any of the given points inside their internal area (excluding the parabola itself).

Examples

Input


3
-1 0
0 2
1 0


Output


2


Input


5
1 0
1 -1
0 -1
-1 0
-1 -1


Output


1

Note

On the pictures below all U-shaped parabolas that pass through at least two given points are drawn for each of the examples. The U-shaped parabolas that do not have any given point inside their internal area are drawn in red. 

<image> The first example.  <image> The second example. 

### Response

```cpp
#include <bits/stdc++.h>
using namespace std;
const int INF = 2e9;
const long long LINF = 2e16;
const int magic = 348;
const int MOD = 1e9 + 7;
const double eps = 1e-14;
const double pi = acos(-1);
template <typename T>
inline void Get(T &first) {
  bool f;
  char ch;
  T res;
  while (!isdigit(ch = getchar()) && ch != '-') {
  }
  if (ch == '-')
    f = false, res = 0;
  else
    f = true, res = ch - '0';
  while (isdigit(ch = getchar())) res = res * 10 + ch - '0';
  first = (f ? res : (-res));
}
template <typename T1, typename... T2>
inline void Get(T1 &first, T2 &...second) {
  Get(first);
  Get(second...);
}
struct fastio {
  static const int S = 1e7;
  char rbuf[S + 48], wbuf[S + 48];
  int rpos, wpos, len;
  fastio() { rpos = len = wpos = 0; }
  inline char Getchar() {
    if (rpos == len) rpos = 0, len = fread(rbuf, 1, S, stdin);
    if (!len) return EOF;
    return rbuf[rpos++];
  }
  template <class T>
  inline void Get(T &first) {
    char ch;
    bool f;
    T res;
    while (!isdigit(ch = Getchar()) && ch != '-') {
    }
    if (ch == '-')
      f = false, res = 0;
    else
      f = true, res = ch - '0';
    while (isdigit(ch = Getchar())) res = res * 10 + ch - '0';
    first = (f ? res : -res);
  }
  template <typename T1, typename... T2>
  inline void Get(T1 &first, T2 &...second) {
    Get(first);
    Get(second...);
  }
  inline void getstring(char *s) {
    char ch;
    while ((ch = Getchar()) <= 32) {
    }
    for (; ch > 32; ch = Getchar()) *s++ = ch;
    *s = '\0';
  }
  inline void flush() {
    fwrite(wbuf, 1, wpos, stdout);
    fflush(stdout);
    wpos = 0;
  }
  inline void Writechar(char ch) {
    if (wpos == S) flush();
    wbuf[wpos++] = ch;
  }
  template <class T>
  inline void Print(T first, char ch) {
    char s[20];
    int pt = 0;
    if (first == 0)
      s[++pt] = '0';
    else {
      if (first < 0) Writechar('-'), first = -first;
      while (first) s[++pt] = '0' + first % 10, first /= 10;
    }
    while (pt) Writechar(s[pt--]);
    Writechar(ch);
  }
  inline void printstring(char *s) {
    int pt = 1;
    while (s[pt] != '\0') Writechar(s[pt++]);
  }
} io;
template <typename T>
inline void check_max(T &first, T cmp) {
  first = max(first, cmp);
}
template <typename T>
inline void check_min(T &first, T cmp) {
  first = min(first, cmp);
}
template <typename T>
inline T myabs(T first) {
  return first >= 0 ? first : -first;
}
template <typename T>
inline T gcd(T first, T second) {
  return second == 0 ? first : gcd(second, first % second);
}
inline int add(int first) {
  if (first >= MOD) first -= MOD;
  return first;
}
inline int add(int first, int MO) {
  if (first >= MO) first -= MO;
  return first;
}
inline int sub(int first) {
  if (first < 0) first += MOD;
  return first;
}
inline int sub(int first, int MO) {
  if (first < 0) first += MO;
  return first;
}
inline void Add(int &first, int second) { first = add(first + second); }
inline void Add(int &first, int second, int MO) {
  first = add(first + second, MO);
}
inline void Sub(int &first, int second) { first = sub(first - second); }
inline void Sub(int &first, int second, int MO) {
  first = sub(first - second, MO);
}
template <typename T>
inline int quick_pow(int first, T second) {
  int res = 1;
  while (second) {
    if (second & 1) res = 1ll * res * first % MOD;
    first = 1ll * first * first % MOD;
    second >>= 1;
  }
  return res;
}
template <typename T>
inline int quick_pow(int first, T second, int MO) {
  int res = 1;
  while (second) {
    if (second & 1) res = 1ll * res * first % MO;
    first = 1ll * first * first % MO;
    second >>= 1;
  }
  return res;
}
const int MAXN = 1e5;
int n;
inline bool islarger(double first, double second) {
  return first - second > eps;
}
inline bool issmaller(double first, double second) {
  return first - second < -eps;
}
inline bool isequal(double first, double second) {
  return !islarger(first, second) && !issmaller(first, second);
}
struct Vector {
  double first, second;
  Vector() {}
  inline Vector(double _x, double _y) {
    first = _x;
    second = _y;
  }
  inline Vector operator+(Vector other) {
    return Vector(first + other.first, second + other.second);
  }
  inline Vector operator-(Vector other) {
    return Vector(first - other.first, second - other.second);
  }
  inline bool operator<(const Vector &other) const {
    if (!isequal(first, other.first)) return issmaller(first, other.first);
    return islarger(second, other.second);
  }
  inline void print() { cout << int(first) << ' ' << int(second) << endl; }
} a[MAXN + 48];
int atot;
inline double query_k(Vector first, Vector second) {
  if (isequal(first.first, second.first))
    return islarger(second.second, first.second) ? double(LINF) : double(-LINF);
  return (second.second - first.second) / (second.first - first.first);
}
Vector conv[MAXN + 48];
int tot = 0;
inline void convex_hull() {
  for (register int i = 1; i <= n; i++) {
    if (atot && isequal(a[atot].first, a[i].first)) continue;
    a[++atot] = a[i];
  }
  for (register int i = 1; i <= atot; i++) {
    while (tot >= 2 && !islarger(query_k(conv[tot - 1], conv[tot]),
                                 query_k(conv[tot], a[i])))
      tot--;
    conv[++tot] = a[i];
  }
}
int main() {
  Get(n);
  for (register int i = 1; i <= n; i++)
    Get(a[i].first, a[i].second), a[i].second -= a[i].first * a[i].first;
  sort(a + 1, a + n + 1);
  convex_hull();
  printf("%d\n", tot - 1);
  io.flush();
  return 0;
}

```