Untitled
unknown
plain_text
a year ago
2.6 kB
14
Indexable
#include <bits/stdc++.h>
using namespace std;
#define int long long
struct SegTree {
int n;
vector<int> tree;
SegTree(vector<int>& arr) {
n = arr.size();
tree.resize(4 * n);
build(1, 0, n - 1, arr);
}
void build(int node, int start, int end, vector<int>& arr) {
if (start == end) {
tree[node] = arr[start];
} else {
int mid = (start + end) / 2;
build(2 * node, start, mid, arr);
build(2 * node + 1, mid + 1, end, arr);
tree[node] = tree[2 * node] & tree[2 * node + 1];
}
}
int query(int node, int start, int end, int l, int r) {
if (r < start || end < l) return LLONG_MAX;
if (l <= start && end <= r) return tree[node];
int mid = (start + end) / 2;
int left = query(2 * node, start, mid, l, r);
int right = query(2 * node + 1, mid + 1, end, l, r);
return left & right;
}
int andrange(int l, int r) {
return query(1, 0, n - 1, l, r);
}
};
int32_t main() {
int n, m, k;
cin >> n >> m >> k;
vector<int> a(n);
for (int i = 0; i < n; i++) cin >> a[i];
SegTree st(a);
vector<int> bits(31, m);
int ans = LLONG_MIN;
for (int i = 0; i < n; i++) {
if (i < m) {
for (int j = 0; j < 31; j++) {
if (a[i] & (1LL << j)) bits[j]--;
}
if (i == m - 1) {
int andd = st.andrange(0, m - 1);
// cout<<andd<<endl;
int tempk = k;
for (int j =30; j>=0; j--) {
int opsneeded = bits[j] * (1LL << j);
// cout<<opsneeded<<endl;
if (tempk >= opsneeded) {
andd |= (1LL << j);
tempk -= opsneeded;
}
}
ans = max(ans, andd);
}
} else {
int andd = st.andrange(i - m + 1, i);
// cout<<andd<<endl;
int tempk = k;
for (int j=30; j>=0; j--) {
int opsneeded = bits[j] * (1LL << j);
if (tempk >= opsneeded) {
andd |= (1LL << j);
tempk -= opsneeded;
}
}
ans = max(ans, andd);
for (int j = 0; j < 31; j++) {
if (a[i - m] & (1LL << j)) bits[j]++;
if (a[i] & (1LL << j)) bits[j]--;
}
}
}
cout << ans << endl;
}
Editor is loading...
Leave a Comment