Submission #1219168

#TimeUsernameProblemLanguageResultExecution timeMemory
1219168giorgi123glmXORanges (eJOI19_xoranges)C++20
0 / 100
118 ms6352 KiB
#include <functional>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

template <typename T>
class segment_tree {
    public:
        int siz = 1;
        vector <T> segtree;
        function <T(T, T)> merge;
        
        segment_tree(function <T(T, T)> IN) : merge (IN) {}

        void resize (int n) {
            while (siz < n)
                siz *= 2;
            segtree.resize (2 * siz);
        }

        void update (int ind, T K) {
            int u = siz + ind - 1;
            segtree[u] = K;
            u /= 2;
            while (u)
                segtree[u] = merge (
                    segtree[2 * u], segtree[2 * u + 1]
                ), u /= 2;
        }

        T get (int L, int R, int u, int l, int r) {
            if (r < L || R < l)
                return T();

            if (L <= l && r <= R)
                return segtree[u];

            const int m = (l + r) / 2;
            return merge (
                get (L, R, 2 * u, l, m),
                get (L, R, 2 * u + 1, m + 1, r)
            );
        }

        T get (int L, int R) {
            return get (L, R, 1, 1, siz);
        }
};

int main () {
    ios::sync_with_stdio (false);
    cin.tie (0);
    cout.tie (0);

    int N = 0, Q = 0;
    cin >> N >> Q;

    vector <segment_tree <int> > segtree (
        2,
        segment_tree <int> (
            [](int a, int b) {
                return a ^ b;
            }
        )
    );
    segtree[0].resize (N + 1);
    segtree[1].resize (N + 1);

    for (int i = 1; i <= N; i++) {
        int t = 0;
        cin >> t;

        segtree[i % 2].update (i, t);
    }

    while (Q--) {
        int t = 0;
        cin >> t;

        if (t == 1) {
            int a = 0, b = 0;
            cin >> a >> b;

            segtree[a % 2].update (a, b);
        } else {
            int l = 0, r = 0;
            cin >> l >> r;

            cout << (
                segtree[r % 2].get (l, r)
            ) << '\n';
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...