#include <bits/stdc++.h>
using namespace std;
struct Point {
  double x, y;
  Point(double x = 0, double y = 0) : x(x), y(y) {}
};
Point operator+(Point A, Point B) { return Point(A.x + B.x, A.y + B.y); }
Point operator-(Point A, Point B) { return Point(A.x - B.x, A.y - B.y); }
Point operator*(Point A, double p) { return Point(A.x * p, A.y * p); }
Point operator/(Point A, double p) { return Point(A.x / p, A.y / p); }
bool operator<(const Point& a, const Point& b) {
  return a.x < b.x || (a.x == b.x && a.y < b.y);
}
const double eps = 1e-10;
double dcmp(double x) {
  if (fabs(x) < eps)
    return 0;
  else
    return x < 0 ? -1 : 1;
}
bool operator==(const Point& a, const Point& b) {
  return dcmp(a.x - b.x) == 0 && dcmp(a.y - b.y) == 0;
}
double Dot(Point A, Point B) { return A.x * B.x + A.y * B.y; }
double Length(Point A) { return sqrt(Dot(A, A)); }
double Angle(Point A, Point B) {
  return acos(Dot(A, B) / Length(A) / Length(B));
}
double Cross(Point A, Point B) { return A.x * B.y - A.y * B.x; }
double Area2(Point A, Point B, Point C) { return Cross(B - A, C - A); }
int main() {
  int n;
  cin >> n;
  double x, y;
  vector<Point> p;
  for (int i = 0; i < n; i++) {
    cin >> x >> y;
    y = y - x * x;
    p.emplace_back(x, y);
  }
  sort(p.begin(), p.end());
  p.erase(unique(p.begin(), p.end()), p.end());
  deque<Point> q;
  for (int i = n - 1; ~i; i--) {
    while (q.size() > 1 &&
           Cross(q.back() - q[q.size() - 2], p[i] - q[q.size() - 2]) <= 0)
      q.pop_back();
    q.push_back(p[i]);
  }
  int ans = 0;
  for (int i = 1; i < q.size(); i++)
    if (q[i].x != q[i - 1].x) ans++;
  cout << ans << endl;
}
