You are given n numbers a1, a2, ..., an. You can perform at most k operations. For each operation you can multiply one of the numbers by x. We want to make <image> as large as possible, where <image> denotes the bitwise OR. 

Find the maximum possible value of <image> after performing at most k operations optimally.

Input

The first line contains three integers n, k and x (1 ≤ n ≤ 200 000, 1 ≤ k ≤ 10, 2 ≤ x ≤ 8).

The second line contains n integers a1, a2, ..., an (0 ≤ ai ≤ 109).

Output

Output the maximum value of a bitwise OR of sequence elements after performing operations.

Examples

Input

3 1 2
1 1 1


Output

3


Input

4 2 3
1 2 4 8


Output

79

Note

For the first sample, any possible choice of doing one operation will result the same three numbers 1, 1, 2 so the result is <image>. 

For the second sample if we multiply 8 by 3 two times we'll get 72. In this case the numbers will become 1, 2, 4, 72 so the OR value will be 79 and is the largest possible result.
#include <bits/stdc++.h>
using namespace std;
const long double eps = 1e-9;
class solver {
 public:
  int n, k;
  long long x;
  vector<long long> a;
  vector<long long> pre;
  vector<long long> pos;
  void make() {
    n = 20;
    k = 10;
    x = 8;
    a.resize(n);
    for (int i = 0; i < n; ++i) {
      a[i] = rand() % 2;
      a[i] = 536870911;
    }
  }
  void pr_test() {
    cout << n << " " << k << " " << x << endl;
    for (int i = 0; i < n; ++i) {
      cout << a[i] << " \n"[i == (n - 1)];
    }
  }
  void input() {
    cin >> n >> k >> x;
    a.resize(n);
    for (int i = 0; i < n; ++i) {
      scanf("%d", &a[i]);
    }
  }
  long long solve() {
    pre.assign(n, 0);
    for (int i = 0; i < n; ++i) {
      if (i > 0) pre[i] = pre[i - 1];
      pre[i] |= a[i];
    }
    pos.assign(n, 0);
    for (int i = n - 1; i >= 0; --i) {
      if (i != n - 1) pos[i] = pos[i + 1];
      pos[i] |= a[i];
    }
    long long ans = 0;
    long long nx = 1;
    for (int i = 0; i < k; ++i) {
      nx *= x;
    }
    for (int i = 0; i < n; ++i) {
      long long che =
          (i != 0 ? pre[i - 1] : 0) | (i != (n - 1) ? pos[i + 1] : 0);
      che |= a[i] * nx;
      ans = max(ans, che);
    }
    return ans;
  }
  vector<int> per;
  vector<vector<int> > pers;
  void dfs(int c, int k) {
    if (c == n) {
      pers.push_back(per);
      return;
    }
    for (int i = k; i >= 0; --i) {
      per[c] = i;
      dfs(c + 1, k - i);
    }
  }
  long long pw(int st) {
    long long ans = 1;
    for (int i = 0; i < st; ++i) ans *= x;
    return ans;
  }
  long long brut() {
    per.resize(n);
    dfs(0, k);
    long long ans = 0;
    for (int i = 0; i < pers.size(); ++i) {
      long long tans = 0;
      for (int j = 0; j < n; ++j) {
        tans |= a[j] * pw(pers[i][j]);
      }
      if (tans < 0) {
        cout << "tans: " << tans << endl;
      }
      ans = max(tans, ans);
    }
    return ans;
  }
};
int main() {
  solver slv;
  slv.input();
  cout << slv.solve() << endl;
  return 0;
}
