#include <bits/stdc++.h>
using namespace std;
struct Point {
  long long x, y, ind;
  Point(long long x, long long y) : x(x), y(y) {}
  Point() {}
  Point operator+(const Point &P) const { return Point(P.x + x, P.y + y); }
  Point operator-(const Point &P) const { return Point(x - P.x, y - P.y); }
  long long square() { return x * x + y * y; }
};
long long getBit(long long x, long long i) { return (x >> i) & 1LL; }
const long long MX = 4e5;
long long sgn[MX];
vector<long long> tree[MX];
long long n;
void dfs(long long u, long long s = 1) {
  for (long long v : tree[u]) {
    dfs(v, s * sgn[u]);
  }
  if (tree[u].empty()) {
    sgn[u] *= s;
    assert(u < n);
  }
}
const long long LIMIT = 1e6;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> n;
  deque<Point> P(n);
  for (long long i = 0; i < (long long)n; i++) {
    cin >> P[i].x >> P[i].y;
    P[i].ind = i;
  }
  if (n == 1) {
    cout << "1\n";
    return 0;
  }
  for (long long i = 0; i < 2 * n; i++) {
    sgn[i] = -2;
  }
  long long cnt = n;
  for (long long i = 0; i < n - 2; i++) {
    assert(P[0].square() <= LIMIT * LIMIT);
    assert(P[1].square() <= LIMIT * LIMIT);
    long long best = 1e18;
    long long choiceMask;
    for (long long mask = 0; mask < (1LL << 3); mask++) {
      if (__builtin_popcount(mask) != 2) continue;
      vector<long long> v;
      for (long long k = 0; k < 3; k++) {
        if (getBit(mask, k) == 1) {
          v.push_back(k);
        }
      }
      long long posi = (P[v[0]] + P[v[1]]).square();
      long long nega = (P[v[0]] - P[v[1]]).square();
      if (min(posi, nega) < best) {
        best = min(posi, nega);
        choiceMask = mask;
      }
    }
    if (choiceMask == 6) {
      swap(P[0], P[2]);
    } else if (choiceMask == 5) {
      swap(P[1], P[2]);
    }
    Point P0 = P[0];
    Point P1 = P[1];
    P.pop_front();
    P.pop_front();
    long long posi = (P0 + P1).square();
    long long nega = (P0 - P1).square();
    assert(sgn[P0.ind] == -2);
    assert(sgn[P1.ind] == -2);
    if (posi < nega) {
      sgn[P0.ind] = 1;
      sgn[P1.ind] = 1;
      Point sum = P0 + P1;
      sum.ind = cnt;
      P.push_back(sum);
    } else {
      sgn[P0.ind] = 1;
      sgn[P1.ind] = -1;
      Point minus = P0 - P1;
      minus.ind = cnt;
      P.push_back(minus);
    }
    tree[cnt].push_back(P0.ind);
    tree[cnt].push_back(P1.ind);
    cnt++;
  }
  assert(P.size() == 2);
  long long posi = (P[0] + P[1]).square();
  long long nega = (P[0] - P[1]).square();
  assert(sgn[P[0].ind] == -2);
  assert(sgn[P[1].ind] == -2);
  if (posi < nega) {
    sgn[P[0].ind] = 1;
    sgn[P[1].ind] = 1;
  } else {
    sgn[P[0].ind] = 1;
    sgn[P[1].ind] = -1;
  }
  sgn[cnt] = 1;
  tree[cnt].push_back(P[0].ind);
  tree[cnt].push_back(P[1].ind);
  dfs(cnt);
  for (long long i = 0; i < (long long)n; i++) cout << sgn[i] << " ";
  return 0;
}
