#include <bits/stdc++.h>
#pragma warning(disable : 4996);
using namespace std;
const long long LLINF = 0x3f3f3f3f3f3f3f3f;
const int INF = 0x3f3f3f3f;
const double eps = 1e-6;
const double PI = acos(-1.0);
const int MOD = 1e9 + 7;
const int MAXN = 1e5 + 5;
const int MAXM = 1e7 + 5;
const int DIR[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
long long pos[MAXN];
int n, k, A, B;
long long mi2[31];
int getnum(long long L, long long R) {
  int num1 = upper_bound(pos, pos + k, R) - pos;
  int num2 = lower_bound(pos, pos + k, L) - pos;
  return num1 - num2;
}
long long dfs(int L, int R) {
  int num = getnum(L, R);
  if (num == 0)
    return A;
  else {
    long long yiqi = 1ll * B * num * (R - L + 1);
    if (L == R)
      return yiqi;
    else
      return min(yiqi, dfs(L, (L + R) / 2) + dfs((L + R) / 2 + 1, R));
  }
}
int main() {
  mi2[0] = 1;
  for (int i = 1; i < 31; i++) mi2[i] = mi2[i - 1] * 2;
  cin >> n >> k >> A >> B;
  for (int i = 0; i < k; i++) {
    cin >> pos[i];
  }
  sort(pos, pos + k);
  cout << dfs(1, mi2[n]) << endl;
}
