#include <bits/stdc++.h>
using namespace std;
int N, C;
int A[3005], freq[3005], ans;
bool isPal[3005][3005];
void updateLongestPalindrome() {
for (int i = N; i >= 1; --i) {
for (int j = i; j <= N; ++j) {
if (i == j) isPal[i][j] = true;
else if (i+1 == j) isPal[i][j] = (A[i] == A[j]);
else isPal[i][j] = (A[i] == A[j] && isPal[i+1][j-1]);
if (isPal[i][j]) ans = max(ans, j - i + 1);
}
}
}
// 중심 (l,r)에서 시작해 정렬된 구간을 하나 삽입했을 때 가능한 최대 회문 길이
void tryExpand(int l, int r) {
// 왼쪽 확장 가능한 비내림 구간 찾기
vector<int> leftSeq;
int prev = -1;
for (int i = l-1; i >= 1; --i) {
if (prev == -1 || prev <= A[i]) {
leftSeq.push_back(A[i]);
prev = A[i];
} else break;
}
if (leftSeq.empty()) return;
reverse(leftSeq.begin(), leftSeq.end());
int Lsize = (int)leftSeq.size();
// 이분 탐색: 왼쪽에서 몇 개를 정렬로 가져갈지
int lo = 0, hi = Lsize-1;
while (lo <= hi) {
int mid = (lo + hi) / 2;
vector<int> cnt(C+1, 0);
for (int i = 0; i <= mid; ++i) cnt[leftSeq[i]]++;
int matched = 0;
bool can = true, pureSym = true;
for (int i = r+1; i <= N && matched <= mid; ++i) {
if (cnt[A[i]] > 0) {
cnt[A[i]]--;
matched++;
} else {
pureSym = false;
if (A[i] < leftSeq[mid]) can = false;
}
}
can &= (matched > mid);
if (can) {
int Lpos = l - mid - 1, Rpos = r + mid + 1;
if (pureSym) while (Lpos > 1 && Rpos < N && A[Lpos-1] == A[Rpos+1]) {
Lpos--; Rpos++;
}
ans = max(ans, Rpos - Lpos + 1);
lo = mid + 1;
} else hi = mid - 1;
}
}
void solveDirection() {
updateLongestPalindrome();
for (int i = 1; i <= N; ++i) {
int l = i, r = i;
while (l > 1 && r < N && isPal[l-1][r+1]) { l--; r++; }
tryExpand(l, r);
l = i; r = i-1;
while (l > 1 && r < N && isPal[l-1][r+1]) { l--; r++; }
tryExpand(l, r);
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> N >> C;
for (int i = 1; i <= N; ++i) {
cin >> A[i];
freq[A[i]]++;
ans = max(ans, freq[A[i]]); // 한 문자만 반복되는 회문
}
// 원본 방향
solveDirection();
// 뒤집어서 대칭 방향
reverse(A+1, A+N+1);
for (int i = 1; i <= N; ++i) A[i] = C - A[i] + 1;
solveDirection();
cout << ans << "\n";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgTiwgQzsKaW50IEFbMzAwNV0sIGZyZXFbMzAwNV0sIGFuczsKYm9vbCBpc1BhbFszMDA1XVszMDA1XTsKCnZvaWQgdXBkYXRlTG9uZ2VzdFBhbGluZHJvbWUoKSB7CiAgICBmb3IgKGludCBpID0gTjsgaSA+PSAxOyAtLWkpIHsKICAgICAgICBmb3IgKGludCBqID0gaTsgaiA8PSBOOyArK2opIHsKICAgICAgICAgICAgaWYgKGkgPT0gaikgaXNQYWxbaV1bal0gPSB0cnVlOwogICAgICAgICAgICBlbHNlIGlmIChpKzEgPT0gaikgaXNQYWxbaV1bal0gPSAoQVtpXSA9PSBBW2pdKTsKICAgICAgICAgICAgZWxzZSBpc1BhbFtpXVtqXSA9IChBW2ldID09IEFbal0gJiYgaXNQYWxbaSsxXVtqLTFdKTsKICAgICAgICAgICAgaWYgKGlzUGFsW2ldW2pdKSBhbnMgPSBtYXgoYW5zLCBqIC0gaSArIDEpOwogICAgICAgIH0KICAgIH0KfQoKLy8g7KSR7IusIChsLHIp7JeQ7IScIOyLnOyeke2VtCDsoJXroKzrkJwg6rWs6rCE7J2EIO2VmOuCmCDsgr3snoXtlojsnYQg65WMIOqwgOuKpe2VnCDstZzrjIAg7ZqM66y4IOq4uOydtAp2b2lkIHRyeUV4cGFuZChpbnQgbCwgaW50IHIpIHsKICAgIC8vIOyZvOyqvSDtmZXsnqUg6rCA64ql7ZWcIOu5hOuCtOumvCDqtazqsIQg7LC+6riwCiAgICB2ZWN0b3I8aW50PiBsZWZ0U2VxOwogICAgaW50IHByZXYgPSAtMTsKICAgIGZvciAoaW50IGkgPSBsLTE7IGkgPj0gMTsgLS1pKSB7CiAgICAgICAgaWYgKHByZXYgPT0gLTEgfHwgcHJldiA8PSBBW2ldKSB7CiAgICAgICAgICAgIGxlZnRTZXEucHVzaF9iYWNrKEFbaV0pOwogICAgICAgICAgICBwcmV2ID0gQVtpXTsKICAgICAgICB9IGVsc2UgYnJlYWs7CiAgICB9CiAgICBpZiAobGVmdFNlcS5lbXB0eSgpKSByZXR1cm47CiAgICByZXZlcnNlKGxlZnRTZXEuYmVnaW4oKSwgbGVmdFNlcS5lbmQoKSk7CgogICAgaW50IExzaXplID0gKGludClsZWZ0U2VxLnNpemUoKTsKICAgIC8vIOydtOu2hCDtg5Dsg4k6IOyZvOyqveyXkOyEnCDrqocg6rCc66W8IOygleugrOuhnCDqsIDsoLjqsIjsp4AKICAgIGludCBsbyA9IDAsIGhpID0gTHNpemUtMTsKICAgIHdoaWxlIChsbyA8PSBoaSkgewogICAgICAgIGludCBtaWQgPSAobG8gKyBoaSkgLyAyOwogICAgICAgIHZlY3RvcjxpbnQ+IGNudChDKzEsIDApOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IG1pZDsgKytpKSBjbnRbbGVmdFNlcVtpXV0rKzsKICAgICAgICBpbnQgbWF0Y2hlZCA9IDA7CiAgICAgICAgYm9vbCBjYW4gPSB0cnVlLCBwdXJlU3ltID0gdHJ1ZTsKCiAgICAgICAgZm9yIChpbnQgaSA9IHIrMTsgaSA8PSBOICYmIG1hdGNoZWQgPD0gbWlkOyArK2kpIHsKICAgICAgICAgICAgaWYgKGNudFtBW2ldXSA+IDApIHsKICAgICAgICAgICAgICAgIGNudFtBW2ldXS0tOwogICAgICAgICAgICAgICAgbWF0Y2hlZCsrOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcHVyZVN5bSA9IGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKEFbaV0gPCBsZWZ0U2VxW21pZF0pIGNhbiA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhbiAmPSAobWF0Y2hlZCA+IG1pZCk7CgogICAgICAgIGlmIChjYW4pIHsKICAgICAgICAgICAgaW50IExwb3MgPSBsIC0gbWlkIC0gMSwgUnBvcyA9IHIgKyBtaWQgKyAxOwogICAgICAgICAgICBpZiAocHVyZVN5bSkgd2hpbGUgKExwb3MgPiAxICYmIFJwb3MgPCBOICYmIEFbTHBvcy0xXSA9PSBBW1Jwb3MrMV0pIHsKICAgICAgICAgICAgICAgIExwb3MtLTsgUnBvcysrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFucyA9IG1heChhbnMsIFJwb3MgLSBMcG9zICsgMSk7CiAgICAgICAgICAgIGxvID0gbWlkICsgMTsKICAgICAgICB9IGVsc2UgaGkgPSBtaWQgLSAxOwogICAgfQp9Cgp2b2lkIHNvbHZlRGlyZWN0aW9uKCkgewogICAgdXBkYXRlTG9uZ2VzdFBhbGluZHJvbWUoKTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IE47ICsraSkgewogICAgICAgIGludCBsID0gaSwgciA9IGk7CiAgICAgICAgd2hpbGUgKGwgPiAxICYmIHIgPCBOICYmIGlzUGFsW2wtMV1bcisxXSkgeyBsLS07IHIrKzsgfQogICAgICAgIHRyeUV4cGFuZChsLCByKTsKCiAgICAgICAgbCA9IGk7IHIgPSBpLTE7CiAgICAgICAgd2hpbGUgKGwgPiAxICYmIHIgPCBOICYmIGlzUGFsW2wtMV1bcisxXSkgeyBsLS07IHIrKzsgfQogICAgICAgIHRyeUV4cGFuZChsLCByKTsKICAgIH0KfQoKaW50IG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKICAgIGNpbiA+PiBOID4+IEM7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBOOyArK2kpIHsKICAgICAgICBjaW4gPj4gQVtpXTsKICAgICAgICBmcmVxW0FbaV1dKys7CiAgICAgICAgYW5zID0gbWF4KGFucywgZnJlcVtBW2ldXSk7IC8vIO2VnCDrrLjsnpDrp4wg67CY67O165CY64qUIO2ajOusuAogICAgfQoKICAgIC8vIOybkOuzuCDrsKntlqUKICAgIHNvbHZlRGlyZWN0aW9uKCk7CiAgICAvLyDrkqTsp5HslrTshJwg64yA7LmtIOuwqe2WpQogICAgcmV2ZXJzZShBKzEsIEErTisxKTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IE47ICsraSkgQVtpXSA9IEMgLSBBW2ldICsgMTsKICAgIHNvbHZlRGlyZWN0aW9uKCk7CgogICAgY291dCA8PCBhbnMgPDwgIlxuIjsKICAgIHJldHVybiAwOwp9