#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,k1,k2;
const int N = (int)5e5+5;
int a[N],l[N],mxl[N];
signed main(){
cin >> n >> k1 >> k2;
for(int i=1;i<=n;i++) cin >> a[i];
if(k1>=61) {
cout << 0; return 0;
}
int ans = 0;
k2 = min(k2,62ll);
for(int bt=60;bt>=0;bt--){
for(int i=1;i<=n;i++){
if((a[i]&(1ll<<bt))==(a[i-1]&(1ll<<bt))){
l[i] = l[i-1];
}else{
l[i] = i-1;
}
if(k1<=bt && bt<k2){ // bt 记录的是最高位的信息
ans += max(0ll,l[i]-mxl[i]);
}
mxl[i] = max(mxl[i],l[i]); // 记录
}
}
cout << ans;
return 0;
}
我们深入分析一下,这里的区间怎么算呢,我们的 l[ ] 数组记录的是右段是i的时候最左端的最大下标
如果 l[5] = 2,表示 区间1~5 和 2 ~5 都是符合的区间