#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-8;
const double pi = acos(-1.0);
int sgn(double x) {
  if (fabs(x) < eps) return 0;
  if (x < 0)
    return -1;
  else
    return 1;
}
struct Point {
  long long x, y;
  Point() {}
  Point(long long _x, long long _y) {
    x = _x;
    y = _y;
  }
  bool operator==(const Point& b) const {
    return sgn(x - b.x) == 0 && sgn(y - b.y) == 0;
  }
  bool operator<(const Point& b) const {
    return sgn(x - b.x) == 0 ? sgn(y - b.y) < 0 : x < b.x;
  }
  Point operator-(const Point& b) const { return Point(x - b.x, y - b.y); }
  long long operator^(const Point& b) const { return x * b.y - y * b.x; }
  Point operator+(const Point& b) const { return Point(x + b.x, y + b.y); }
};
bool cmp(Point a, Point b) {
  if (a.x != b.x) return a.x < b.x;
  return a.y < b.y;
}
int n;
Point arr[100008];
vector<Point> v;
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) {
    scanf("%I64d %I64d", &arr[i].x, &arr[i].y);
    arr[i].y -= arr[i].x * arr[i].x;
  }
  sort(arr + 1, arr + n + 1, cmp);
  if (n <= 1) {
    printf("%d\n", n - 1);
    return 0;
  }
  v.push_back(arr[n]);
  for (int i = n - 1; i >= 1; --i) {
    for (int j = (int)v.size() - 1; j >= 1; --j) {
      if (((v[j] - v[j - 1]) ^ (arr[i] - v[j - 1])) <= 0)
        v.pop_back();
      else
        break;
    }
    if (v.empty() || v[v.size() - 1].x != arr[i].x) v.push_back(arr[i]);
  }
  cout << v.size() - 1 << endl;
  return 0;
}
