Submission #1140871

#TimeUsernameProblemLanguageResultExecution timeMemory
1140871samy_nagyXOR (IZhO12_xor)C++20
0 / 100
0 ms320 KiB
#include <bits/stdc++.h>
/// لتكن مشيئتك
#define int long long
#define ll long long
using namespace std;
const int N = 1e3 + 5, mod = 1e9 + 7;// 1e9+7, 998244353
struct SegTree {
#define LF (x*2+1)
#define RT (x*2+2)
#define md ((lx+rx) >> 1)
    vector<int> seg;
    vector<int> lazy;
    int ignoreValue;
    int sz;

    SegTree(int n, vector<pair<int, int>> &a) {
        sz = 1;
        while (sz < n)sz *= 2;
        ignoreValue = 0; /// update this
        seg.assign(4 * n, ignoreValue);
        build(a);
    }

    void build(vector<pair<int, int>> &a, int x = 0, int lx = 0, int rx = -1) {
        if (rx == -1)rx = sz - 1;
        if (lx == rx) {
            if (lx < a.size()) {
                seg[x] = a[lx].second;
            }
            return;
        }
        build(a, LF, lx, md);
        build(a, RT, md + 1, rx);
        seg[x] = merge(seg[LF], seg[RT]);

    }

    int merge(const int &lf, const int &rt) {
        return max(lf, rt); /// update this
    }

    int query(int l, int r, int x = 0, int lx = 0, int rx = -1) {
        if (rx == -1)rx = sz - 1;
        if (l <= lx and rx <= r) {
            return seg[x];
        }
        if (r < lx or rx < l) {
            return ignoreValue;
        }
        return merge(
                query(l, r, LF, lx, md),
                query(l, r, RT, md + 1, rx)
        );
    }

#undef md
#undef LF
#undef RT
};

void solve() {
    int n, x;
    cin >> n >> x;
    vector<pair<int, int>> pref;
    int c{};
    for (int i = 0; i < n; ++i) {
        int u;
        cin >> u;
        c ^= u;
        pref.emplace_back(c, i);
    }
    std::sort(pref.begin(), pref.end());
    if (!x) {
        cout << 1 << " " << n;
        return;
    }
//    for (auto [l, r]: pref)cout << l << " " << r << endl;
    SegTree tree(n, pref);
    auto get = [&](int tar, int ed) -> pair<int, int> {
        /// Range prefR
        int L = 0, R = 0;
        for (int i = 30; i >= ed; --i) {
            if ((tar >> i) & 1) {
                L |= (1ll << i);
                R |= (1ll << i);
            }
        }
        R |= (1ll << ed) - 1;
        int l = lower_bound(pref.begin(), pref.end(), make_pair(L, 0ll)) - pref.begin();
        int r = upper_bound(pref.begin(), pref.end(), make_pair(R - 1, 0ll)) - pref.begin();
        if (l > r)return {0, 0};
        if (r == n)r--;
//        cout << tar << " " << ed << endl;
//        cout << L << " " << R << " " << l << " " << r << endl;
        /// PrefL
        pair<int, int> ret = {-1, -1};
        int end = tree.query(l, r);
//        cout << end << endl;
        for (int j = 0; j < n; j++) {
            bool ok = 1;
            for (int i = 30; i >= ed; --i) {
                if (((tar >> i) & 1)) {
                    ok &= (((pref[j].first >> i) & 1) == 0);
                }
            }
            if (ok) {
                int st = pref[j].second;
                if (st > end)swap(st, end);
//                cout << st << " " << l << " " << r << " " << end << endl;
                ret = max(ret, {end - st + 1, st + 1});
            }
        }


        return ret;
    };
    pair<int, int> ans = {-1, -1};/// k , i
    int i;
    for (i = 30; ~i; --i) {
        if ((x >> i) & 1) {
            break;
        }
    }
    for (int j = 0; j <= 30; ++j) {
        if ((x >> j) & 1) {
            ans = max(ans, get(x, (j)));
            break;
        }
    }

    for (; ~i; --i) {
        if (!((x >> i) & 1)) {
            int tar = x | (1ll << i);
            ans = max(ans, get(tar, i));
        }
    }
    cout << ans.second << " " << ans.first ;

}

signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);



    int tc = 1;
    // cin >> tc;
    for (int i = 1; i <= tc; ++i) {
        solve();
        //  cout << "\n";

    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...