#include <bits/stdc++.h>
const double eps = 1e-8;
const int N = 200005;
std::map<int, int> map;
struct pos {
  double x, y;
} p[N], r[N], stk[N];
int top;
int read() {
  int x = 0, v = 1;
  char ch = getchar();
  for (; ch < '0' || ch > '9'; v = (ch == '-') ? (-1) : v, ch = getchar())
    ;
  for (; ch <= '9' && ch >= '0'; x = x * 10 + ch - '0', ch = getchar())
    ;
  return x * v;
}
pos get(pos a, pos b) {
  double B = (b.y - a.y + a.x * a.x - b.x * b.x) / (b.x - a.x);
  double C = (b.y - B * b.x - b.x * b.x);
  return (pos){B, C};
}
bool in(pos a, pos b) { return (a.x * a.x + a.x * b.x + b.y - a.y >= -eps); }
int main(void) {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) {
    int x = read(), y = read();
    p[i] = (pos){(double)x, (double)y};
    if (map.find(x) == map.end())
      map[x] = y;
    else {
      if (y > map[x]) map[x] = y;
    }
  }
  for (std::pair<int, int> x : map) {
    pos now = (pos){(double)x.first, (double)x.second};
    pos tmp = get(stk[top - 1], now);
    while (top > 1 && in(stk[top], get(stk[top - 1], now))) top--;
    stk[++top] = now;
  }
  printf("%d\n", top - 1);
  return 0;
}
