Bill is a famous mathematician in BubbleLand. Thanks to his revolutionary math discoveries he was able to make enough money to build a beautiful house. Unfortunately, for not paying property tax on time, court decided to punish Bill by making him lose a part of his property.

Bill’s property can be observed as a convex regular 2n-sided polygon A0 A1... A2n - 1 A2n, A2n = A0, with sides of the exactly 1 meter in length. 

Court rules for removing part of his property are as follows:

  * Split every edge Ak Ak + 1, k = 0... 2n - 1 in n equal parts of size 1 / n with points P0, P1, ..., Pn - 1
  * On every edge A2k A2k + 1, k = 0... n - 1 court will choose one point B2k = Pi for some i = 0, ..., n - 1 such that <image>
  * On every edge A2k + 1A2k + 2, k = 0...n - 1 Bill will choose one point B2k + 1 = Pi for some i = 0, ..., n - 1 such that <image>
  * Bill gets to keep property inside of 2n-sided polygon B0 B1... B2n - 1



Luckily, Bill found out which B2k points the court chose. Even though he is a great mathematician, his house is very big and he has a hard time calculating. Therefore, he is asking you to help him choose points so he maximizes area of property he can keep.

Input

The first line contains one integer number n (2 ≤ n ≤ 50000), representing number of edges of 2n-sided polygon.

The second line contains n distinct integer numbers B2k (0 ≤ B2k ≤ n - 1, k = 0... n - 1) separated by a single space, representing points the court chose. If B2k = i, the court chose point Pi on side A2k A2k + 1.

Output

Output contains n distinct integers separated by a single space representing points B1, B3, ..., B2n - 1 Bill should choose in order to maximize the property area. If there are multiple solutions that maximize the area, return any of them.

Example

Input

3
0 1 2


Output

0 2 1

Note

To maximize area Bill should choose points: B1 = P0, B3 = P2, B5 = P1

<image>
#include <bits/stdc++.h>
using namespace std;
struct point {
  double x, y;
  point(double xx = 0, double yy = 0) : x(xx), y(yy) {}
  point operator+(point a) { return point(x + a.x, y + a.y); }
  point operator-(point a) { return point(x - a.x, y - a.y); }
  point operator*(double r) { return point(x * r, y * r); }
};
int ok[1111111], st[1111111], ed[1111111], id[1111111], b[1111111];
double areaC[1111111], areaD[1111111];
double dst(point a, point b) {
  return sqrt(((a.x - b.x) * (a.x - b.x)) + ((a.y - b.y) * (a.y - b.y)));
}
bool cmp(int u, int v) {
  if (ok[u] != ok[v]) return ok[u] > ok[v];
  if (ok[u]) {
    return areaC[u] + areaD[v] > areaC[v] + areaD[u];
  }
  return areaD[u] + areaC[v] > areaC[u] + areaD[v];
}
double multi(point a, point b) { return fabs(a.x * b.y - a.y * b.x); }
int res[1111111];
int main() {
  int n;
  double al, pi = 4 * atan(1), L;
  point C, D, A, B;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) scanf("%d", b + i);
  al = (2 * n - 2) * pi / (2 * n);
  al = pi - al;
  L = n + 2 * n * cos(al);
  C = point(cos(al), sin(al)) * n;
  D = point(L, 0) + point(cos(pi - al), sin(pi - al)) * n;
  for (int i = 0; i < n; i++) {
    id[i] = i;
    st[i] = b[i];
    ed[i] = n - b[(i + 1) % n];
    if (st[i] < ed[i])
      ok[i] = 1;
    else if (st[i] > ed[i])
      ok[i] = -1;
    else
      ok[i] = 0;
    A = point(cos(al), sin(al)) * st[i];
    B = point(L, 0) + point(cos(pi - al), sin(pi - al)) * ed[i];
    areaC[i] = multi(A - C, B - C);
    areaD[i] = multi(A - D, B - D);
  }
  sort(id, id + n, cmp);
  for (int i = 0; i < n; i++) res[id[i]] = i;
  for (int i = 0; i < n; i++) {
    if (i) printf(" ");
    printf("%d", res[i]);
  }
  puts("");
  return 0;
}
