#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-6;
struct Point {
  double x, y;
  Point(double a = 0, double b = 0) : x(a), y(b) {}
  inline void read() { scanf("%lf%lf", &x, &y); }
  inline void print() { printf("%lf %lf\n", x, y); }
  inline Point operator+(const Point &b) { return Point(x + b.x, y + b.y); }
  inline Point operator-(const Point &b) { return Point(x - b.x, y - b.y); }
  inline Point operator*(const double &p) { return Point(x * p, y * p); }
  inline Point operator/(const double &p) { return Point(x / p, y / p); }
  inline bool operator==(const Point &b) const {
    return fabs(x - b.x) < eps && fabs(y - b.y) < eps;
  }
  inline bool operator<(const Point &b) const {
    return x < b.x || (x == b.x && y > b.y);
  }
} A[100010], q[100010];
inline double Dot(Point A, Point B) { return A.x * B.x + A.y * B.y; }
inline double Cross(Point A, Point B) { return A.x * B.y - A.y * B.x; }
int main() {
  int n, tail = 0;
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) A[i].read();
  for (int i = 1; i <= n; ++i) A[i].y -= A[i].x * A[i].x;
  sort(A + 1, A + n + 1);
  for (int i = 1; i <= n; ++i) {
    if (tail && q[tail].x == A[i].x) continue;
    while (tail > 1 && Cross(q[tail] - q[tail - 1], A[i] - q[tail - 1]) >= 0)
      --tail;
    q[++tail] = A[i];
  }
  printf("%d\n", tail - 1);
  return 0;
}
