func_code_string: #include <bits/stdc++.h>   #pragma comment(linker,  /stack:200000000 )   #pragma GCC optimize( Ofast )   #pragma GCC target( sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native )   using namespace std;   const int block_size = 320;   const long long mod = 1e9 + 7;   const long long inf = 1e9 + 7;   const long double eps = 1e-9;   const double PI = atan(1) * 4;   template <typename T>   inline int sign(const T &a) {     if (a < 0) return -1;     if (a > 0) return 1;     return 0;   }   template <typename T, typename S>   inline bool upmin(T &a, const S &b) {     return a > b ? a = b, 1 : 0;   }   template <typename T, typename S>   inline bool upmax(T &a, const S &b) {     return a < b ? a = b, 1 : 0;   }   template <typename T>   inline void in(T &x) {     x = 0;     T f = 1;     char ch = getchar();     while (!isdigit(ch)) {       if (ch ==  - ) f = -1;       ch = getchar();     }     while (isdigit(ch)) {       x = x * 10 + ch -  0 ;       ch = getchar();     }     x *= f;   }   long long twop(int x) { return 1LL << x; }   template <typename A, typename B>   inline void in(A &x, B &y) {     in(x);     in(y);   }   template <typename A, typename B, typename C>   inline void in(A &x, B &y, C &z) {     in(x);     in(y);     in(z);   }   template <typename A, typename B, typename C, typename D>   inline void in(A &x, B &y, C &z, D &d) {     in(x);     in(y);     in(z);     in(d);   }   namespace SOLVE {   long long n;   long long a[100000];   long long dp[2];   long long pre[20000][2];   long long getSum(long long l, long long r, long long v) {     return pre[r][v] - pre[l - 1][v];   }   void main() {     in(n);     n++;     for (long long i = 1; i < n; i++) {       in(a[i]);       a[i]--;       pre[i][a[i]] = 1;     }     for (long long i = 1; i < n; i++) {       for (long long j = 0; j < 2; j++) pre[i][j] += pre[i - 1][j];     }     memset(dp, 0xcf, sizeof(dp));     for (long long i = 1; i < n; i++) {       if (a[i] == 0) {         dp[0]++;       } else {         dp[1]++;         upmax(dp[1], dp[0] + 1);       }     }     long long ans = max(dp[0], dp[1]);     for (long long i = 1; i < n; i++) {       memset(dp, 0, sizeof(dp));       for (long long j = i; j < n; j++) {         if (a[j] == 1) {           dp[1]++;         } else {           dp[0]++;           upmax(dp[0], dp[1] + 1);         }         upmax(ans,               getSum(1, i - 1, 0) + getSum(j + 1, n - 1, 1) + max(dp[0], dp[1]));       }     }     cout << ans << endl;   }   }  // namespace SOLVE   int main() {     SOLVE::main();     return 0;   }   