/****
Wood Cube
****/

#include <bits/stdc++.h>

using namespace std;

using ll = long long;
using pii = pair<int,int>;

#define pb push_back

const ll MOD = 1LL << 32;
const int mxn = 10006;
const ll MXL = 0x3f3f3f3f3f3f3f3fLL;

int n;
int a[mxn];
vector<pii> s;

unsigned A[mxn * 2], B[mxn * 2];
unsigned IA[mxn * 2], IB[mxn * 2];

int random(unsigned seed, int range, int times) {
        seed = seed * A[times] + B[times];
        return (ll)seed * range / (1LL << 32);
}

bool checkSeed(unsigned seed) {
        int cnt = 0;
        for (auto i : s) {
                int x = i.second;
                int pa = a[x];
                int pb = random(seed, pa + 1, pa + 1);
                int pc = random(seed, pb + 1, n + pb + 1);
                cnt += (pc == x);
        }
        // cout << cnt << endl;
        return cnt >= 8;
}

unsigned state;
int random(int range) {
        state = state * 1664525 + 1013904223;
        return (ll)state * range / (1LL << 32);
}

int b[mxn];
void trySeed(unsigned seed) {
        // cout << seed << endl;
        if (checkSeed(seed)) {
                state = seed;
                iota(b, b + n, 0);
                for (int i = 0; i < n; ++i)
                        swap(b[i], b[random(i + 1)]);
                for (int i = 0; i < n; ++i)
                        swap(b[i], b[random(i + 1)]);
                if (!equal(a, a + n, b)) return;
                for (int i = 0; i < n; ++i)
                        swap(b[i], b[random(i + 1)]);
                for (int i = 0; i < n; ++i)
                        printf("%d ", b[i] + 1);
                puts("");
                exit(0);
        }
}

ll cal(ll m, ll d, ll l, ll r) {
        if (l == 0) return 0;
        if (d == 0) return MXL; // 无解
        if (d * 2 > m) return cal(m, m - d, m - r, m - l);
        if ((l - 1) / d < r / d) return (l - 1) / d + 1;
        ll k = cal(d, (-m % d + d) % d, l % d, r % d);
        return k == MXL ? MXL : (k * m + l - 1) / d + 1; // 无解2
}

void check(ll ta, ll ra, ll va, ll tb, ll rb, ll vb) {
        // 假设 random(times = ra, range = la) = va

        // bool debug = false;
        // #define DEB if (debug)
        // if (va == 3638 && vb == 10) {
        //         puts("WTF!!");
        //         cout << tb << ' ' << rb << ' ' << vb << endl;
        //         // random(tb, )
        //         debug = true;
        // }

        // 固定在tb的时刻

        ll l = vb * MOD / rb;
        ll r = (vb + 1) * MOD / rb;
        ll L = va * MOD / ra;
        ll R = (va + 1) * MOD / ra;

        // DEB cout << l << " " << (A[tb] * mySeed + B[tb]) % MOD << " " << r << endl;
        // DEB cout << L << " " << (A[ta] * mySeed + B[ta]) % MOD << " " << R << endl;

        ll A = ::A[tb - ta];
        ll B = ::B[tb - ta];
        ll IA = ::IA[ta];
        ll IB = ::IB[ta];

        auto next = [&](ll x) {
                ll val = (A * x + B) % MOD;
                if (l <= val && val <= r)
                        return x;
                return x + cal(MOD, A, ((l - val) % MOD + MOD) % MOD, ((r - val) % MOD + MOD) % MOD);
        };

        ll cnt = 0;
        for (ll i = next(L); i <= R; i = next(i + 1)) {
                ++cnt;
                trySeed((i * IA + IB) % MOD);
                // DEB cout << i << " " << (i * IA + IB) % MOD << endl;
                // DEB cout << (i * IA + IB) % MOD << endl;
        }
        // DEB cout << cnt << " " << MOD / ra / rb << endl;
}

int main() {

        cin >> n;
        for (int i = 0; i < n; ++i)
                scanf("%d", &a[i]);
        // const unsigned mySeed = time(0);
        // n = 10000;
        // iota(a, a + n, 1);
        // state = mySeed;
        // for (int i = 0; i < n; ++i)
        //         swap(a[i], a[random(i + 1)]);
        // for (int i = 0; i < n; ++i)
        //         swap(a[i], a[random(i + 1)]);

        for (int i = 0; i < n; ++i)
                --a[i];

        A[0] = 1, B[0] = 0;
        IA[0] = 1, IB[0] = 0;
        static unsigned inv = 4276115653;
        for (int i = 1; i <= n * 2; ++i) {
                A[i] = A[i - 1] * 1664525;
                B[i] = 1664525 * B[i - 1] + 1013904223;
                IA[i] = inv * IA[i - 1];
                IB[i] = inv * (IB[i - 1] - 1013904223);
        }

        // cout << random(mySeed, 9942, 9942) << endl;
        // cout << random(mySeed, 3639, n + 3639) << endl;


        for (int i = 0; i < n; ++i)
                s.pb({-(a[i] - i), i});
        sort(s.begin(), s.end());
        s.erase(s.begin() + 12, s.end());

        for (auto i : s) {
                int x = i.second;
                for (int j = a[x]; j >= x && j >= 500; --j) { // j太小复杂度要炸
                        check(a[x] + 1, a[x], j, n + j + 1, j, x);
                }
        }

        assert(false);

        return 0;
}

