func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MOD = 999999929, MAXN = 300005, P2 = (1 << 19), MTS = (1 << 20) + 5;   int pot2[MAXN];   int TREE[MTS][2];   int n;   long long suma(int p, int k, int num) {     p += P2;     k += P2;     long long res = 0LL;     while (p < k) {       if ((p & 1)) {         res += TREE[p++][num];         if (res >= MOD) res -= MOD;       }       if (!(k & 1)) {         res += TREE[k--][num];         if (res >= MOD) res -= MOD;       }       p >>= 1;       k >>= 1;     }     if (p == k) {       res += TREE[p][num];       if (res >= MOD) res -= MOD;     }     return res;   }   void aT(int pos, int val, int num) {     pos += P2;     TREE[pos][num] = val;     while (pos > 1) {       pos >>= 1;       TREE[pos][num] = TREE[(pos << 1)][num] + TREE[((pos << 1) + 1)][num];       if (TREE[pos][num] >= MOD) TREE[pos][num] -= MOD;     }   }   void add(int pos) {     aT(pos, pot2[pos], 0);     aT(n - pos + 1, pot2[n - pos + 1], 1);   }   bool palindrom(int l) {     int k = min(l - 1, n - l);     long long a = suma(l - k, l + k, 0);     long long b = suma(n - l - k + 1, n - l + k + 1, 1);     if (l - k > n - l - k + 1) {       int g = l - k - (n - l - k + 1);       b *= pot2[g];       b %= MOD;     } else {       int g = n - l + 1 - l;       a *= pot2[g];       a %= MOD;     }     return (a == b);   }   int main() {     scanf( %d , &n);     pot2[0] = 1;     for (int i = 1; i <= n; ++i) {       pot2[i] = (pot2[i - 1] << 1);       if (pot2[i] >= MOD) pot2[i] %= MOD;     }     for (int i = 0; i < n; ++i) {       int a;       scanf( %d , &a);       if (!palindrom(a)) {         printf( YES );         return 0;       }       add(a);     }     printf( NO );   }   