Lyndon 分解。
#include <bits/stdc++.h>
using namespace std;
// #define CF
#define ll long long
#define ul unsigned ll
#define LL __int128_t
#define db double
#define DB long db
#define pii pair<int, int>
#define fi first
#define se second
#define mkpr make_pair
#define mem(a, x) memset(a, x, sizeof(a))
#define rep(i, l, r) for (int i(l), i##End(r); i <= i##End; i = -~i)
#define per(i, r, l) for (int i(r), i##End(l); i >= i##End; i = ~-i)
template<typename T, typename U> void chkmx(T &_a, U _b) { if (_a < _b) _a = _b; }
template<typename T, typename U> void chkmn(T &_a, U _b) { if (_a > _b) _a = _b; }
constexpr int N = 600005;
constexpr ll mod = 998244353, INF = 0x3f3f3f3f3f3f3f3f;
int n, m, t;
ll a[N];
vector<int> ans;
void solve() {
scanf("%d", &n), t = n;
rep(i, 1, n) scanf("%lld", &a[i]);
rep(i, 1, n) a[++t] = a[i];
int i = 1, j, k; while (i <= t) {
for (j = i, k = i + 1; a[j] <= a[k]; k++) j = (a[j] == a[k] ? j + 1 : i);
while (i <= j) ans.emplace_back(i + k - j - 1), i += k - j;
} rep(i, 2, ans.size()) if (ans[i - 1] >= n) { m = ans[i - 2] + 1; break; }
rep(i, m, n + m - 1) printf("%d ", a[i]);
}
void init() {}
int main() {
init();
#ifdef CF
int _; scanf("%d", &_);
while (_--) solve();
#else
solve();
#endif
return 0;
}