Untitled

 avatar
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