#include <cmath>
#include <cassert>
#include <cstdio>
#include <cstring>

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

#define forn(i, n) for (int i = 0; i < (int)(n); i++)
#define sz(a) (int)(a).size()

typedef double dbl;
typedef long long ll;

struct pnt
{
  int x, y;

  pnt( int _x = 0, int _y = 0 ) : x(_x), y(_y) { }

  inline pnt operator + ( const pnt &p ) const { return pnt(x + p.x, y + p.y); }
  inline pnt operator - ( const pnt &p ) const { return pnt(x - p.x, y - p.y); }

  inline ll operator * ( const pnt &p ) const { return (ll)x * p.y - (ll)y * p.x; }

  inline bool operator < ( const pnt &p ) const { return x < p.x || (x == p.x && y < p.y); }

  inline ll d2() const { return (ll)x * x + (ll)y * y; }
  inline dbl ang() const { return atan2((dbl)y, (dbl)x); }
};

typedef vector <pnt> vpnt;

inline bool pless( const pnt &a, const pnt &b )
{
  ll x = a * b;
  return x != 0 ? x < 0 : a.d2() < b.d2();
}

vpnt ConvexHull( vpnt p )
{
  int n = sz(p), mi = 0;
  assert(n > 0);
  forn(i, n)
    if (p[mi] < p[i])
      mi = i;
  swap(p[0], p[mi]);
  for (int i = 1; i < n; i++)
    p[i] = p[i] - p[0];
  sort(p.begin() + 1, p.end(), pless);

  int rn = 0;
  vpnt r(n);
  r[rn++] = p[0];
  for (int i = 1; i < n; i++)
  {
    pnt q = p[i] + p[0];
    while (rn >= 2 && (r[rn - 1] - r[rn - 2]) * (q - r[rn - 2]) >= 0)
      rn--;
    r[rn++] = q;
  }
  r.resize(rn);
  return r;
}

struct MagicStructure
{
  int N;
  pnt st;
  vector <pnt> p;
  vector <dbl> ang;

  void Build( int n, int *x, int *y ) // O(NlogN)
  {
    assert(n > 0);
    p.resize(N = n);
    forn(i, N)
      p[i].x = x[i], p[i].y = y[i];
    p = ConvexHull(p);
    N = sz(p);
    reverse(p.begin(), p.end());
 
    ang.resize(N);
    forn(i, N)
      ang[i] = (p[(i + 1) % N] - p[i]).ang();
    forn(i, N)
      if (i && ang[i] < ang[i - 1])
        ang[i] += 2 * M_PI;
  }

  ll GetMax( int a, int b ) // O(logK)
  {
    if (N < 3)
    {
      ll ma = -(ll)8e18;
      forn(l, N)
        ma = max(ma, (ll)a * p[l].x + (ll)b * p[l].y);
      return ma;
    }

    int l = 0, r = N - 1;
    dbl x = atan2(a, -b);
    while (x < ang[0])
      x += 2 * M_PI;
    while (l != r)
    {
      int m = (l + r + 1) / 2;
      if (ang[m] < x)
        l = m;
      else
        r = m - 1;
    }
    l = (l + 1) % N;
    return (ll)a * p[l].x + (ll)b * p[l].y;
  }
};