제출 #1307378

#제출 시각아이디문제언어결과실행 시간메모리
1307378ayazXORanges (eJOI19_xoranges)C++20
100 / 100
126 ms28140 KiB
#include <bits/stdc++.h> using namespace std; #ifdef LOCAL #include "debug.h" #else #define debug(...) 42 #define line() "author : AyazN"; #endif typedef long long ll; #define all(x) (x).begin(), (x).end() #define isz(x) (int)(x.size()) #define int ll typedef long double ld; typedef pair<int,int> pii; typedef vector<int> vi; typedef vector<vi> vvi; typedef vector<pii> vpii; mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); const int sz = 200500, inf = 1000000000; const ll mod = 1000000007, INF = 1000000000000000000; void precompute() {} struct SegmentTree { vi st; int n; vi a; void init(int _n, int A[]) { n = _n; st.resize((n<<2)|1); a.resize(n + 1); for (int i = 1; i <= n; i++) a[i] = A[i]; } void build(int l, int r, int v) { if (l == r) { st[v] = a[l]; return; } int mid = (l + r)>>1; build(l, mid, v<<1); build(mid + 1, r, v<<1|1); st[v] = (st[v<<1] ^ st[v<<1|1]); } int getans(int ql, int qr, int l, int r, int v) { if (ql > r || l > qr) return 0; if (ql <= l && r <= qr) return st[v]; int mid = (l + r)>>1; return (getans(ql, qr, l, mid, v<<1) ^ getans(ql, qr, mid + 1, r, v<<1|1)); } int getans(int l, int r) { return getans(l, r, 1, n, 1); } void update(int l, int r, int pos, int val, int v) { if (l > pos || pos > r) return; if (l == r) { st[v] = val; return; } int mid = (l + r)>>1; update(l, mid, pos, val, v<<1); update(mid + 1, r, pos, val, v<<1|1); st[v] = (st[v<<1] ^ st[v<<1|1]); } void update(int pos, int val) { update(1, n, pos, val, 1); } }; int a[sz]; signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); #ifdef LOCAL freopen("err.log", "w", stderr); #endif precompute(); int n, q; cin >> n >> q; for (int i = 1; i <= n; i++) { cin >> a[i]; } SegmentTree st, stOdd, stEven; st.init(n, a); st.build(1, n, 1); int b[n + 1]; for (int i = 1; i <= n; i++) b[i] = (i & 1 ? 0 : a[i]); stEven.init(n, b); stEven.build(1, n, 1); for (int i = 1; i <= n; i++) b[i] = (!(i & 1) ? 0 : a[i]); stOdd.init(n, b); stOdd.build(1, n, 1); while (q--) { int t; cin >> t; if (t == 1) { int i, x; cin >> i >> x; st.update(i, x); if (i & 1) { stOdd.update(i, x); } else { stEven.update(i, x); } } else { int l, r; cin >> l >> r; if ((r - l + 1) & 1) { int ans = st.getans(l, r); if (l & 1) { ans ^= stEven.getans(l, r); } else { ans ^= stOdd.getans(l, r); } cout << ans << '\n'; } else { cout << 0 << '\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...