#include <bits/stdc++.h>
template <typename T, typename _>
inline bool Max(T &x, _ y) {
  return x < y ? x = y, true : false;
}
template <typename T, typename _>
inline bool Min(T &x, _ y) {
  return x > y ? x = y, true : false;
}
template <typename T>
inline void Rd(T &x) {
  static char c;
  x = 0;
  bool f = false;
  while (c = getchar_unlocked(), c < 48) f |= (c == '-');
  do x = (x << 1) + (x << 3) + (c ^ 48);
  while (c = getchar_unlocked(), c > 47);
  f ? x = -x : 0;
}
struct node {
  long long x, y;
  bool operator<(const node p) const { return (x == p.x) ? y > p.y : x < p.x; }
};
bool cmp(node a, node b, node c) {
  return (a.y - b.y) * (b.x - c.x) <= (b.y - c.y) * (a.x - b.x);
}
node p[100005], stk[100005];
int main() {
  int n, x, y;
  Rd(n);
  for (int i(1), i_END_(n + 1); i < i_END_; i++)
    Rd(x), Rd(y), p[i] = (node){x, y - (long long)x * x};
  std::sort(p + 1, p + 1 + n);
  int top = 0;
  for (int i(1), i_END_(n + 1); i < i_END_; i++) {
    if (i != 1 && p[i].x == p[i - 1].x) continue;
    while (top >= 2 && cmp(stk[top - 1], stk[top], p[i])) top--;
    stk[++top] = p[i];
  }
  printf("%d\n", top - 1);
  return 0;
}
