#include <bits/stdc++.h>
template <typename T>
inline void read(T& x) {
  char cu = getchar();
  x = 0;
  bool fla = 0;
  while (!isdigit(cu)) {
    if (cu == '-') fla = 1;
    cu = getchar();
  }
  while (isdigit(cu)) x = x * 10 + cu - '0', cu = getchar();
  if (fla) x = -x;
}
template <typename T>
inline void printe(const T x) {
  if (x >= 10) printe(x / 10);
  putchar(x % 10 + '0');
}
template <typename T>
inline void print(const T x) {
  if (x < 0)
    putchar('-'), printe(-x);
  else
    printe(x);
}
template <typename T>
inline T min(const T a, const T b) {
  return a < b ? a : b;
}
template <typename T>
inline T max(const T a, const T b) {
  return a > b ? a : b;
}
int n, top = 1;
struct Point {
  long long x, y;
  bool operator<(const Point b) const { return x == b.x ? y > b.y : x < b.x; }
  Point operator-(const Point b) const { return (Point){x - b.x, y - b.y}; }
} Q[100001];
long long Cross(Point a, Point b) { return a.x * b.y - a.y * b.x; }
int main() {
  read(n);
  for (register int i = 1; i <= n; i++)
    read(Q[i].x), read(Q[i].y), Q[i].y -= Q[i].x * Q[i].x;
  std::sort(Q + 1, Q + n + 1);
  for (register int i = 2; i <= n; i++)
    if (Q[i].x != Q[top].x) {
      while (top > 1 && Cross(Q[i] - Q[top - 1], Q[top] - Q[top - 1]) <= 0)
        top--;
      Q[++top] = Q[i];
    }
  print(top - 1);
  return 0;
}
