#include using namespace std; #define len(x) int((x).size()) struct SuffixArray { vector sa, lcp; SuffixArray(string& s, int lim = 256) { // or basic_string int n = len(s) + 1, k = 0, a, b; vector x(begin(s), end(s) + 1), y(n), ws(max(n, lim)), rank(n); sa = lcp = y, iota(begin(sa), end(sa), 0); for (int j = 0, p = 0; p < n; j = max(1, j * 2), lim = p) { p = j, iota(begin(y), end(y), n - j); for (int i = 0; i < n; i++) if (sa[i] >= j) y[p++] = sa[i] - j; fill(begin(ws), end(ws), 0); for (int i = 0; i < n; i++) ws[x[i]]++; for (int i = 1; i < lim; i++) 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; for (int i = 1; i < n; i++) a = sa[i - 1], b = sa[i], x[b] = (y[a] == y[b] && y[a + j] == y[b + j]) ? p - 1 : p++; } for (int i = 1; i < n; i++) 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++) ; } }; template struct RMQ { vector> jmp; RMQ(const vector& V) : jmp(1, V) { for (int pw = 1, k = 1; pw * 2 <= len(V); pw *= 2, ++k) { jmp.emplace_back(len(V) - pw * 2 + 1); for (int j = 0; j < len(jmp[k]); j++) jmp[k][j] = min(jmp[k - 1][j], jmp[k - 1][j + pw]); } } T query(int a, int b) { assert(a < b); // or return inf if a == b int dep = 31 - __builtin_clz(b - a); return min(jmp[dep][a], jmp[dep][b - (1 << dep)]); } }; int main() { int n; cin >> n; vector a(n); for (int i = 0; i < n; i++) { cin >> a[i]; } string s{}; for (int i = 0; i < 2 * n; i++) { int curr = a[i % n], nxt = a[(i + 1) % n]; if (curr < nxt) s += "a"; else s += "b"; } auto [sa, lcp] = SuffixArray(s); RMQ ds{lcp}; vector pos(n * 2), left(len(sa)), right(len(sa)); int v = -1; for (int i = 0; i < len(sa); i++) { if (sa[i] < len(pos)) { pos[sa[i]] = i; } left[i] = v; if (sa[i] < n) v = i; } v = len(sa); for (int i = len(sa) - 1; i >= 0; i--) { right[i] = v; if (sa[i] < n) { v = i; } } for (int i = 0; i < n; i++) { int sol = 0; if (left[pos[i]] != -1) { sol = max(sol, ds.query(left[pos[i]] + 1, pos[i] + 1)); } if (right[pos[i]] != len(sa)) { sol = max(sol, ds.query(pos[i] + 1, right[pos[i]] + 1)); } if (sol >= n) { cout << -1 << "\n"; } else { cout << sol + 1 << "\n"; } } cout << '\n'; }