제출 #1368998

#제출 시각아이디문제언어결과실행 시간메모리
1368998willwang123XORanges (eJOI19_xoranges)C++20
100 / 100
240 ms10224 KiB
#include <bits/stdc++.h>
using namespace std;

const int maxN = 100000;

struct segment_tree {
    vector<int> tree;

    void init(int n) {
        tree.resize(4*n, 0);
    }

    void build(int id, int l, int r, vector<int> &a) {
        if (l == r) {
            tree[id] = a[l];
        }
        else {
            int mid = (l+r) / 2;
            build(id*2, l, mid, a);
            build(id*2+1, mid+1, r, a);
            tree[id] = tree[id*2] ^ tree[id*2+1];
        }
    }

    void update(int id, int l, int r, int position, int value) {
        if (l == r) {
            tree[id] = value;
        }
        else {
            int mid = (l+r) / 2;
            if (position <= mid) {
                update(id*2, l, mid, position, value);
            }
            else {
                update(id*2+1, mid+1, r, position, value);
            }
            tree[id] = tree[id*2] ^ tree[id*2+1];
        }
    }

    int query(int id, int l, int r, int L, int R) {
        if (l > R || r < L) return 0;
        if (L <=  l && r <= R) return tree[id];
        int mid = (l+r) / 2;
        int left = query(id*2, l, mid, L, R);
        int right = query(id*2+1, mid+1, r, L, R);
        return left ^ right;
    }

};

int main() {
    int n, q;
    cin >> n >> q;
    vector<int> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    vector<int> odd(n);
    vector<int> even(n);

    for (int i = 0; i < n; i++) {
        if (i % 2 == 0) {
            odd[i] = a[i];
            even[i] = 0;
        }
        else {
            odd[i] = 0;
            even[i] = a[i];
        }
    }
    segment_tree odd_segment;
    segment_tree even_segment;
    odd_segment.init(n);
    even_segment.init(n);

    odd_segment.build(1,0,n-1, odd);
    even_segment.build(1,0,n-1,even);

    for (int i = 0; i < q; i++) {
        int operation, l, r;
        cin >> operation >> l >> r;
        if (operation == 1) {
            l--;
            if (l % 2 == 0) {
                odd_segment.update(1, 0, n-1, l, r);
            }
            else {
                even_segment.update(1,0,n-1,l,r);
            }
        }
        else {
            l--;
            r--;
            if ((r-l+1) % 2 == 0) cout << 0 << '\n';
            else {
                if (l % 2 == 0) {
                    int ans = odd_segment.query(1,0,n-1,l, r);
                    cout << ans << '\n';
                }
                else {
                    cout << even_segment.query(1,0,n-1,l,r) << '\n';
                }
            }
        }
    }
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…