#pragma GCC optimize(2)
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int maxn = 1e6 + 10;
int sa[maxn], ht[maxn];
int s[maxn];
int rk[maxn];
int x[maxn], y[maxn], c[maxn];
// sa_i排名为i的下标(在字符串内)
void buildsa(int *s, int *sa, int *rk, int *ht, int n, int m = 200) // nlogn
{
s[n] = 0; //*用来处理溢出问题
for (register int i = 0; i < m; i++)
c[i] = 0;
for (register int i = 0; i < n; i++)
c[x[i] = s[i]]++;
for (register int i = 1; i < m; i++)
c[i] += c[i - 1];
for (register int i = n - 1; i >= 0; i--)
sa[--c[x[i]]] = i;
// 利用基数排序离散化
for (int k = 1; k < n; k <<= 1)
{
int p = 0;
for (int i = n - 1; i >= n - k; i--)
y[p++] = i;
for (int i = 0; i < n; i++)
if (sa[i] >= k)
y[p++] = sa[i] - k;
// 先利用第二位关键字排序
for (int i = 0; i < m; i++)
c[i] = 0;
for (int i = 0; i < n; i++)
c[x[y[i]]]++;
for (int i = 1; i < m; i++)
c[i] += c[i - 1];
for (int i = n - 1; i >= 0; i--)
sa[--c[x[y[i]]]] = y[i];
// 以上为基数排序
for (int j = 0; j <= n; j++)
{
swap(x[j], y[j]);
}
p = 1;
x[sa[0]] = 0;
y[n] = -1;
for (int i = 1; i < n; i++)
if (y[sa[i - 1]] == y[sa[i]] && y[sa[i - 1] + k] == y[sa[i] + k])
{
x[sa[i]] = p - 1;
}
else
x[sa[i]] = p++;
if (p == n)
break;
m = p;
}
for (int i = 0; i < n; i++)
rk[sa[i]] = i;
int k = 0;
for (int i = 0; i < n; i++) // O(n)
{ // ht[i]=lcp(sa[i],sa[i-1]); 取1-n-1
k = max(k - 1, 0ll);
if (rk[i] == 0)
continue;
int j = sa[rk[i] - 1];
while (s[i + k] == s[j + k])
k++;
ht[rk[i]] = k; // 和前前面的lca
}
}
struct node
{
int l, r;
int maxx_id, minn_id;
} e[maxn];
int n;
bool check(int x)
{
int cnt = 0;
for (int i = 1; i < 2 * n + 1; i++)
{
if (ht[i] >= x && (ht[i - 1] >= x))
{
e[cnt].r = i;
e[cnt].maxx_id = max(e[cnt].maxx_id, sa[i]);
e[cnt].minn_id = min(e[cnt].minn_id, sa[i]);
}
else if (ht[i] >= x && (i == 1 || ht[i - 1] < x))
{
e[++cnt].l = i, e[cnt].r = i;
e[cnt].maxx_id = max(sa[i], sa[i - 1]);
e[cnt].minn_id = min(sa[i], sa[i - 1]);
}
}
for (int i = 1; i <= cnt; i++)
{
int mx = e[i].maxx_id;
int mi = e[i].minn_id;
if (mx >= n + 1)
mx = e[i].maxx_id - n - 1;
if (mi >= n + 1)
mi = e[i].minn_id - n - 1;
if (mx == mi)
continue;
if (mx < mi)
swap(mx, mi);
if (mx >= mi + x)
return 1;
}
return 0;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i++)
{
int x;
cin >> x;
s[i - 1] = x;
}
int ans = 0;
s[n] = 180;
for (int i = 0; i <= 88; i++)
{
for (int j = n + 1; j <= 2 * n; j++)
{
s[j] = s[j - n - 1] + i;
}
buildsa(s, sa, rk, ht, 2 * n + 1);
int l = 5, r = n;
int anss = 0;
while (l <= r)
{
int mid = l + r >> 1;
if (check(mid))
{
anss = mid;
l = mid + 1;
}
else
r = mid - 1;
}
ans = max(anss, ans);
}
cout << ans;
}