#include #include #include #include #include #include #include using namespace std; using ll = long long; using ld = long double; using pii = pair; using vi = vector; #define rep(i, a, b) for(int i = a; i < (b); ++i) #define all(x) (x).begin(), (x).end() #define sz(x) (int)(x).size() #define smx(a, b) a = max(a, b) #define smn(a, b) a = min(a, b) #define pb push_back #define endl '\n' const ll MOD = 1e9 + 7; const ld EPS = 1e-9; struct SuffixArray { vi sa, lcp; SuffixArray(string& s, int lim=256) { // or basic_string int n = sz(s) + 1, k = 0, a, b; vi x(all(s)), y(n), ws(max(n, lim)), rank(n); x.push_back(0), sa = lcp = y, iota(all(sa), 0); for (int j = 0, p = 0; p < n; j = max(1, j * 2), lim = p) { p = j, iota(all(y), n - j); rep(i,0,n) if (sa[i] >= j) y[p++] = sa[i] - j; fill(all(ws), 0); rep(i,0,n) ws[x[i]]++; rep(i,1,lim) ws[i] += ws[i - 1]; for (int i = n; i--;) sa[--ws[x[y[i]]]] = y[i]; swap(x, y), p = 1, x[sa[0]] = 0; rep(i,1,n) a = sa[i - 1], b = sa[i], x[b] = (y[a] == y[b] && y[a + j] == y[b + j]) ? p - 1 : p++; } rep(i,1,n) rank[sa[i]] = i; for (int i = 0, j; i < n - 1; lcp[rank[i++]] = k) for (k && k--, j = sa[rank[i] - 1]; s[i + k] == s[j + k]; k++); } }; int main() { cin.tie(0)->sync_with_stdio(0); int n; cin >> n; vector a(n); rep(i,0,n) cin >> a[i]; a.insert(a.end(), all(a)); a.push_back(a[0]); string b; for (int i = 0; i < sz(a) - 1; i++) { if (a[i] < a[i + 1]) b += '0'; else b += '1'; } SuffixArray s(b); vector> pos; for (int i = 1; i < sz(s.sa); i++) { if (s.sa[i] < n) { pos.push_back({s.sa[i], i}); } } vector ans(n); for (int i = 0; i < n - 1; i++) { int k = n + 1; for (int p = pos[i].second + 1; p <= pos[i + 1].second; p++) { k = min(k, s.lcp[p]); } ans[pos[i].first] = max(ans[pos[i].first], k + 1); ans[pos[i + 1].first] = max(ans[pos[i + 1].first], k + 1); } if (*max_element(all(ans)) > n) { // periodic ans.assign(n, -1); } for (auto x : ans) cout << x << "\n"; }