#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
struct tree {
  int l, r;
  int Max;
};
tree g[4 * maxn];
int dis[maxn];
int num[maxn];
int a[maxn];
int n, m;
int max(int a, int b) {
  if (a > b)
    return a;
  else
    return b;
}
void build(int l, int r, int t) {
  g[t].l = l;
  g[t].r = r;
  g[t].Max = -1;
  if (l == r) return;
  int mid = (l + r) / 2;
  build(l, mid, 2 * t);
  build(mid + 1, r, 2 * t + 1);
}
void insert(int l, int r, int t, int k) {
  if (l == g[t].l && r == g[t].r) {
    if (g[t].Max == -1) {
      g[t].Max = k;
    }
    return;
  }
  int mid = (g[t].l + g[t].r) / 2;
  if (l >= mid + 1)
    insert(l, r, 2 * t + 1, k);
  else if (r <= mid)
    insert(l, r, 2 * t, k);
  else {
    insert(l, mid, 2 * t, k);
    insert(mid + 1, r, 2 * t + 1, k);
  }
  g[t].Max = max(g[2 * t].Max, g[2 * t + 1].Max);
}
int find(int l, int r, int t) {
  if (g[t].l == l && g[t].r == r) {
    return g[t].Max;
  }
  int mid = (g[t].l + g[t].r) / 2;
  if (l >= mid + 1)
    return find(l, r, 2 * t + 1);
  else if (r <= mid)
    return find(l, r, 2 * t);
  else {
    return max(find(l, mid, 2 * t), find(mid + 1, r, 2 * t + 1));
  }
}
int main() {
  int i;
  while (scanf("%d", &n) != EOF) {
    for (i = 1; i <= n; i++) {
      scanf("%d", &a[i]);
      num[i] = a[i];
    }
    sort(num + 1, num + n + 1);
    m = unique(num + 1, num + n + 1) - &num[1];
    build(1, m, 1);
    for (i = n; i >= 1; i--) {
      int id = lower_bound(num + 1, num + m + 1, a[i]) - &num[0];
      insert(id, id, 1, i);
      if (id == 1)
        dis[i] = -1;
      else {
        int d = find(1, id - 1, 1);
        if (d != -1)
          dis[i] = find(1, id - 1, 1) - i - 1;
        else
          dis[i] = -1;
      }
    }
    for (i = 1; i < n; i++) printf("%d ", dis[i]);
    printf("%d\n", dis[n]);
  }
  return 0;
}
