#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct Point {
  ll x, y;
  Point(ll x, ll y) : x(x), y(y) {}
  bool operator<(Point p) const { return x < p.x || x == p.x && y < p.y; }
};
const Point O = {0, 0};
using Points = vector<Point>;
struct Vec {
  ll x, y;
  Vec(ll x, ll y) : x(x), y(y) {}
  Vec(Point p1, Point p2) : Vec{p2.x - p1.x, p2.y - p1.y} {}
};
ll cross(Vec v1, Vec v2) { return v1.x * v2.y - v1.y * v2.x; }
bool check(Point p, Point q, Point r) { return cross({p, q}, {q, r}) >= 0; }
int up_chull(Points &ps) {
  sort(ps.begin(), ps.end(), [](Point p1, Point p2) {
    return p1.x < p2.x || p1.x == p2.x && p1.y > p2.y;
  });
  vector<int> I{0};
  for (int i = 1; i < ps.size(); i++) {
    if (!I.empty() && ps[I.back()].x == ps[i].x) continue;
    while (I.size() > 1 && check(ps[I[I.size() - 2]], ps[I.back()], ps[i]))
      I.pop_back();
    I.push_back(i);
  }
  return I.size() - 1;
}
inline int read() {
  int ans = 0, sgn = 1;
  char c = getchar();
  while (!isdigit(c)) {
    if (c == '-') sgn *= -1;
    c = getchar();
  }
  while (isdigit(c)) {
    ans = ans * 10 + c - '0';
    c = getchar();
  }
  return ans * sgn;
}
int main() {
  Points ps;
  int n = read();
  for (int i = 0; i < n; ++i) {
    ll x = read(), y = read();
    ps.emplace_back(x, y - x * x);
  }
  cout << up_chull(ps);
  return 0;
}
