#include <bits/stdc++.h>
using namespace std;
const int MAXN = 105000;
const double eps = 1e-12;
struct point {
  double x, y;
  int idx;
};
bool cmp(point a, point b) { return (a.x < b.x || (a.x == b.x && a.y < b.y)); }
bool eq(double a, double b) { return abs(a - b) <= eps; }
double crossProduct(point a, point b, point c) {
  return a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - b.y);
}
bool isCCW(point a, point b, point c) {
  return a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - b.y) > 0;
}
int n;
int x[MAXN], y[MAXN];
vector<point> p, hull;
int main() {
  scanf("%d", &n);
  p.resize(n);
  for (int i = 0; i < n; i++) {
    scanf("%d %d", &x[i], &y[i]);
    p[i].x = x[i];
    p[i].y = y[i] - 1.0 * x[i] * x[i];
    p[i].idx = i;
  }
  sort(p.begin(), p.end(), cmp);
  vector<point> up;
  point head = p[0], tail = p.back();
  up.push_back(head);
  for (int i = 1; i < (int)p.size(); i++) {
    if (i == (int)p.size() - 1 || !isCCW(tail, head, p[i])) {
      while ((int)up.size() >= 2 && isCCW(up[up.size() - 2], up.back(), p[i]))
        up.pop_back();
      up.push_back(p[i]);
    }
  }
  int ans = 0;
  for (int i = 1; i < (int)up.size(); i++) {
    if (!eq(up[i].x, up[i - 1].x) &&
        (i - 2 < 0 || !eq(0.0, crossProduct(up[i - 2], up[i - 1], up[i]))))
      ans++;
  }
  cout << ans << endl;
  return 0;
}
