func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = (1 << 20) + 1000;   const int INF = 1000000000;   const int Mod = 1000000007;   void update(int tree[], int k, int v) {     while (k < N) {       tree[k] += v;       k += k & (-k);     }   }   int get(int tree[], int k) {     int ret = 0;     while (k) {       ret += tree[k];       k -= k & (-k);     }     return ret;   }   int a[N], n, tot, r[N], mp[N], tree[N];   long long dp[30], sum[30], f[30];   bool cmpr(int i, int j) { return a[i] < a[j]; }   int Hash() {     for (int i = 0; i < tot; i++) r[i] = i;     sort(r, r + tot, cmpr);     int K = 1;     mp[1] = a[r[0]];     for (int i = 0; i < tot; i++) {       if (mp[K] != a[r[i]]) mp[++K] = a[r[i]];       a[r[i]] = K;     }     return K;   }   int main() {     scanf( %d , &n);     tot = 1 << n;     for (int i = 0; i < tot; i++) scanf( %d , &a[i]);     int fuck = Hash();     for (int i = 1; i <= n; i++) {       dp[i] += dp[i - 1];       sum[i] += sum[i - 1];       int len = 1 << (i - 1);       for (int j = tot / len - 2; j >= 0; j -= 2) {         for (int k = 0; k < len; k++) update(tree, a[(j + 1) * len + k], 1);         for (int k = 0; k < len; k++) {           int tmp = get(tree, a[j * len + k] - 1);           sum[i] += tmp;           dp[i] += tmp;         }         for (int k = 0; k < len; k++) update(tree, a[(j + 1) * len + k], -1);         for (int k = 0; k < len; k++) update(tree, a[j * len + k], 1);         for (int k = 0; k < len; k++) {           sum[i] += get(tree, a[(j + 1) * len + k] - 1);         }         for (int k = 0; k < len; k++) update(tree, a[j * len + k], -1);       }     }     int m;     scanf( %d , &m);     while (m--) {       int x;       scanf( %d , &x);       long long t1 = dp[x], t2 = sum[x] - dp[x];       f[0] = 0;       for (int i = 1; i < x; i++) {         f[i] = dp[i];         dp[i] = sum[i] - dp[i];       }       for (int i = x; i <= n; i++) {         dp[i] = dp[i] - t1 + t2;       }       printf( %I64d n , dp[n]);     }     return 0;   }   