#include <bits/stdc++.h>
using namespace std;
using ldouble = long double;
const int N = 5e4 + 10;
const ldouble PI = acos(-1.0), eps = 1e-12;
struct Point {
  ldouble x, y;
  Point operator+(const Point &a) const { return Point{x + a.x, y + a.y}; }
  Point operator-(const Point &a) const { return Point{x - a.x, y - a.y}; }
  Point operator*(ldouble a) { return Point{x * a, y * a}; }
  ldouble operator%(const Point &a) const { return x * a.y - y * a.x; }
  ldouble operator*(const Point &a) const { return x * a.x + y * a.y; }
};
struct Node {
  ldouble a;
  int i;
  bool fl;
};
int n;
int b[N];
vector<Point> vp[2];
vector<Node> v;
void init() {
  ldouble alpha = PI / n;
  Point p = {1, 0};
  Point o = {0, 0};
  Point v1 = {cos(alpha), sin(alpha)};
  Point v2 = {-cos(alpha), sin(alpha)};
  ldouble t = 1.0 / n;
  for (int i = 0; i <= n; ++i) {
    vp[1].push_back(v1 * i * t + p);
  }
  for (int i = 0; i <= n; ++i) {
    vp[0].push_back(v2 * i * t + o);
  }
  reverse(vp[0].begin(), vp[0].end());
}
ldouble go(int x, int y) {
  Point t1 = vp[1][y] - vp[0][x];
  Point t2 = {1, 0};
  return t1 % t2;
}
int get(set<int> &st, bool fl) {
  if (fl) {
    int t = *st.begin();
    st.erase(st.begin());
    return t;
  } else {
    int t = *(--st.end());
    st.erase(--st.end());
    return t;
  }
}
void run() {
  scanf("%d", &n);
  init();
  for (int i = 0; i <= n - 1; ++i) {
    scanf("%d", b + i);
  }
  b[n] = b[0];
  for (int i = 1; i <= n; ++i) {
    ldouble t = go(b[i - 1], b[i]);
    bool fl = t > 0 - eps;
    v.push_back(Node{fabs(t), i - 1, fl});
  }
  sort(v.begin(), v.end(), [](Node a, Node b) { return a.a > b.a; });
  set<int> st;
  for (int i = 0; i < n; ++i) st.insert(i);
  vector<int> ans(n, 0);
  for (auto p : v) {
    ans[p.i] = get(st, p.fl);
  }
  for (int i = 0; i < n; ++i) {
    printf("%d%c", ans[i], " \n"[i == n - 1]);
  }
}
int main() {
  run();
  return 0;
}
