#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline int Chkmax(T &a, T b) {
  return a < b ? a = b, 1 : 0;
}
template <typename T>
inline int Chkmin(T &a, T b) {
  return a > b ? a = b, 1 : 0;
}
template <typename T>
inline T read() {
  T sum = 0, fl = 1;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') fl = -1;
  for (; isdigit(ch); ch = getchar()) sum = (sum << 3) + (sum << 1) + ch - '0';
  return sum * fl;
}
inline void proc_status() {
  ifstream t("/proc/self/status");
  cerr << string(istreambuf_iterator<char>(t), istreambuf_iterator<char>())
       << endl;
}
const int Maxn = 100000 + 100;
int N, Stack[Maxn], top;
pair<long long, long long> A[Maxn];
inline double get_slope(pair<long long, long long> a,
                        pair<long long, long long> b) {
  return (double)(b.second - a.second) / (b.first - a.first);
}
inline void Solve() {
  sort(A + 1, A + N + 1);
  int tot = 0;
  A[N + 1].first = 1e7;
  for (int i = 1; i <= N; ++i)
    if (A[i].first != A[i + 1].first) A[++tot] = A[i];
  for (int i = 1; i <= tot; ++i) {
    while (top >= 2 &&
           get_slope(A[i], A[Stack[top]]) >= get_slope(A[i], A[Stack[top - 1]]))
      --top;
    Stack[++top] = i;
  }
  cout << top - 1 << endl;
}
inline void Input() {
  N = read<int>();
  for (int i = 1; i <= N; ++i)
    A[i].first = read<long long>(),
    A[i].second = read<long long>() - A[i].first * A[i].first;
}
int main() {
  Input();
  Solve();
  return 0;
}
