#include <bits/stdc++.h>
using namespace std;
int ans, t, n, m, i, j, k, a, b, c, d, e, f, q, cases, sum, mm;
double val;
string s, s2, s3, s4;
struct dat {
  double mi, mx;
};
dat tree[(int)(1e6 + 10) + (int)(1e6 + 10) + (int)(1e6 + 10)];
double ar[(int)(1e6 + 10)];
void brainfuck();
void build(int node, int le, int re);
int query(int node, int le, int re, int left_, int right_);
int main() {
  ios_base::sync_with_stdio(NULL);
  cin.tie(NULL);
  cout.tie(NULL);
  brainfuck();
  return 0;
}
void brainfuck() {
  for (i = 0; i < (int)(1e6 + 10) + (int)(1e6 + 10) + (int)(1e6 + 10); i++) {
    tree[i].mi = 999999999999.00;
    tree[i].mx = -1111111111111.0;
  }
  cin >> n;
  for (i = 1; i <= n; i++) cin >> ar[i];
  m = n + n;
  a = 1;
  for (i = n + 1; i <= m; i++) ar[i] = ar[a++];
  a = 1;
  m += n;
  for (i = n + n + 1; i <= m; i++) ar[i] = ar[a++];
  m += n;
  a = 1;
  for (i = n + n + n + 1; i <= m; i++) ar[i] = ar[a++];
  build(1, 1, m);
  for (i = 0; i < (int)(1e6 + 10) + (int)(1e6 + 10) + (int)(1e6 + 10); i++) {
    if (tree[i].mi == 999999999999.00) tree[i].mi *= -1.00;
    if (tree[i].mx == -1111111111111.0) tree[i].mx *= -1.00;
  }
  for (i = 1; i <= n; i++) {
    val = ar[i];
    a = query(1, 1, m, i + 1, m);
    if (a == m - i)
      a = -1;
    else
      a++;
    cout << a << " ";
  }
}
void build(int node, int le, int re) {
  if (le == re) {
    mm = max(node, mm);
    tree[node].mi = tree[node].mx = ar[le];
    return;
  }
  int mid = (le + re) >> 1;
  build(node + node, le, mid);
  build(node + node + 1, mid + 1, re);
  tree[node].mi = min(tree[node + node].mi, tree[node + node + 1].mi);
  tree[node].mx = max(tree[node + node].mx, tree[node + node + 1].mx);
}
int query(int node, int le, int re, int left_, int right_) {
  if (node > mm) return 0;
  if (left_ > right_) return 0;
  if (le == left_ && right_ == re) {
    if (max(val, tree[node].mx) / 2.00 <= tree[node].mi) {
      val = max(val, tree[node].mx);
      return (right_ - left_ + 1);
    }
    int mid = (le + re) >> 1;
    if (max(val, tree[node + node].mx) / 2.00 <= tree[node + node].mi) {
      val = max(val, tree[node + node].mx);
      if (node + node + 1 <= mm)
        return (
            query(node + node + 1, mid + 1, re, max(mid + 1, left_), right_) +
            mid - le + 1);
      else
        return 0;
    }
    int x = 0;
    if (min(right_, mid) - left_ + 1 > 0)
      x = query(node + node, le, mid, left_, min(right_, mid));
    if (min(right_, mid) - left_ + 1 == x || min(right_, mid) - left_ + 1 <= 0)
      return (query(node + node + 1, mid + 1, re, max(mid + 1, left_), right_) +
              x);
    return x;
  }
  int mid = (le + re) >> 1;
  int x = 0;
  if (min(right_, mid) - left_ + 1 > 0)
    x = query(node + node, le, mid, left_, min(right_, mid));
  if (min(right_, mid) - left_ + 1 == x || min(right_, mid) - left_ + 1 <= 0)
    return (query(node + node + 1, mid + 1, re, max(mid + 1, left_), right_) +
            x);
  return x;
}
