func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAXN = 1 << 18;   const long long INF = 0x3f3f3f3f;   int n, k;   bool fav[MAXN];   long long dp[MAXN][18][2][2];   inline void get_max(long long &, long long);   int main() {     scanf( %d%d , &n, &k);     for (register int i = 1; i <= k; ++i) {       int tmp;       scanf( %d , &tmp);       fav[tmp - 1] = true;     }     for (int k = 0; k < (1 << n); ++k)       for (int t = 1; t <= n; ++t)         for (int a = 0; a <= 1; ++a)           for (int b = 0; b <= 1; ++b) dp[k][t][a][b] = -INF;     for (int i = 0; i < (1 << n - 1); ++i)       dp[i][1][fav[i << 1]][fav[i << 1 | 1]] =           dp[i][1][fav[i << 1 | 1]][fav[i << 1]] = fav[i << 1] | fav[i << 1 | 1];     for (int t = 2; t <= n; ++t)       for (int k = 0; k < (1 << n - t); ++k) {         for (register int a = 0; a <= 1; ++a)           for (register int b = 0; b <= 1; ++b)             for (register int c = 0; c <= 1; ++c)               for (register int d = 0; d <= 1; ++d) {                 get_max(dp[k][t][a][c],                         dp[k << 1][t - 1][a][b] + dp[k << 1 | 1][t - 1][c][d] +                             (a | c) + (b | d) + max(c | b, c | d));                 get_max(dp[k][t][a][b], dp[k << 1][t - 1][a][b] +                                             dp[k << 1 | 1][t - 1][c][d] +                                             (a | c) + (b | d) + (b | c));                 get_max(dp[k][t][a][d], dp[k << 1][t - 1][a][b] +                                             dp[k << 1 | 1][t - 1][c][d] +                                             (a | c) + (b | d) + (d | c));                 get_max(dp[k][t][c][a],                         dp[k << 1][t - 1][a][b] + dp[k << 1 | 1][t - 1][c][d] +                             (a | c) + (b | d) + max(a | b, a | d));                 get_max(dp[k][t][c][b], dp[k << 1][t - 1][a][b] +                                             dp[k << 1 | 1][t - 1][c][d] +                                             (a | c) + (b | d) + (a | b));                 get_max(dp[k][t][c][d], dp[k << 1][t - 1][a][b] +                                             dp[k << 1 | 1][t - 1][c][d] +                                             (a | c) + (b | d) + (a | d));               }       }     printf( %lld n , max(max(dp[0][n][0][0], dp[0][n][0][1] + 1),                          max(dp[0][n][1][0] + 1, dp[0][n][1][1] + 1)));     return 0;   }   inline void get_max(long long &a, long long b) { a = max(a, b); }   