#include #define LLI long long int #define FOR(v, a, b) for(LLI v = (a); v < (b); ++v) #define FORE(v, a, b) for(LLI v = (a); v <= (b); ++v) #define REP(v, n) FOR(v, 0, n) #define REPE(v, n) FORE(v, 0, n) #define REV(v, a, b) for(LLI v = (a); v >= (b); --v) #define ALL(x) (x).begin(), (x).end() #define RALL(x) (x).rbegin(), (x).rend() #define ITR(it, c) for(auto it = (c).begin(); it != (c).end(); ++it) #define RITR(it, c) for(auto it = (c).rbegin(); it != (c).rend(); ++it) #define EXIST(c,x) ((c).find(x) != (c).end()) #define fst first #define snd second #define popcount __builtin_popcount #define UNIQ(v) (v).erase(unique(ALL(v)), (v).end()) #define bit(i) (1LL<<(i)) #ifdef DEBUG #include #else #define dump(...) ((void)0) #endif #define gcd __gcd using namespace std; template constexpr T lcm(T m, T n){return m/gcd(m,n)*n;} template void join(ostream &ost, I s, I t, string d=" "){for(auto i=s; i!=t; ++i){if(i!=s)ost< istream& operator>>(istream &is, vector &v){for(auto &a : v) is >> a; return is;} template bool chmin(T &a, const U &b){return (a>b ? a=b, true : false);} template bool chmax(T &a, const U &b){return (a void fill_array(T (&a)[N], const U &v){fill((U*)a, (U*)(a+N), v);} struct Init{ Init(){ cin.tie(0); ios::sync_with_stdio(false); } }init; template string bin_to_str(LLI val){ stringstream ss; ss << bitset(val); return ss.str(); } // dp[digit number][x > L][x < R] LLI dp[64][2][2]; LLI solve(int N, LLI L, LLI R, vector A){ vector pattern_0(61), pattern_1(61), pattern_both(61); REP(i,N){ dump(bitset<30>(A[i])); } vector> sep(62); sep[61] = {N}; REV(i,60,0){ auto &s = sep[i+1]; //dump(s); int cur = 0; int inc = 0, dec = 0; for(auto t : s){ vector temp; FOR(j,cur,t){ temp.push_back((A[j] >> i) & 1); } //dump(temp); int zero = count(ALL(temp), 0); int one = temp.size() - zero; if(zero == 0 or zero == (int)temp.size()){ // all same }else{ if(count(temp.begin(), temp.begin()+zero, 0) == zero){ // increasing inc += 1; sep[i].push_back(cur+zero); }else if(count(temp.begin(), temp.begin()+one, 1) == one){ // decreasing dec += 1; sep[i].push_back(cur+one); }else{ return 0; } } sep[i].push_back(t); cur = t; } if(inc and dec) return 0; if(inc){ pattern_0[i] = true; }else if(dec){ pattern_1[i] = true; }else{ pattern_both[i] = true; } } fill_array(dp, 0); dp[0][0][0] = 1; string l = bin_to_str<61>(L); string r = bin_to_str<61>(R); dump(l,r); REPE(i,60){ REP(j,2){ REP(k,2){ if(pattern_0[60-i] or pattern_both[60-i]){ if(j or l[i] == '0'){ dp[i+1][j][r[i] == '1' or k] += dp[i][j][k]; } } if(pattern_1[60-i] or pattern_both[60-i]){ if(k or r[i] == '1'){ dp[i+1][l[i] == '0' or j][k] += dp[i][j][k]; } } } } } REP(i,61){ int k = 0; if(pattern_0[i]) k += 1; if(pattern_1[i]) k += 2; if(pattern_both[i]) k += 4; cerr << k << " "; } cerr << endl; REP(j,2){ REP(k,2){ REPE(i,61){ cerr << dp[i][j][k] << " "; } cerr << endl; } cerr << endl; } LLI ret = 0; REP(j,2){ REP(k,2){ ret += dp[61][j][k]; } } return ret; } int main(){ LLI N,L,R; while(cin >> N >> L >> R){ vector A(N); cin >> A; cout << solve(N,L,R,A) << endl; } return 0; }