제출 #1307377

#제출 시각아이디문제언어결과실행 시간메모리
1307377ayazXORanges (eJOI19_xoranges)C++20
55 / 100
1096 ms17960 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() {} int a[sz]; struct SegmentTree { vi st; int n; void init(int _n) { n = _n; st.resize((n<<2)|1); } 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); } }; 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; multiset<int> pos[2]; for (int i = 1; i <= n; i++) { cin >> a[i]; pos[i & 1].insert(a[i]); } SegmentTree st; st.init(n); st.build(1, n, 1); while (q--) { int t; cin >> t; if (t == 1) { int i, x; cin >> i >> x; pos[i & 1].erase(pos[i & 1].find(a[i])); st.update(i, x); a[i] = x; pos[i & 1].insert(a[i]); } else { int l, r; cin >> l >> r; if ((r - l + 1) & 1) { int ans = st.getans(l, r); for (int i = 1; i <= (r - l + 1); i++) { if (!(i & 1)) { ans ^= a[l + i - 1]; } } 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...