이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include <cmath>
using namespace std;
typedef unsigned long long ll;
const ll INF = 1e9, MOD = 1e9 + 7;
struct Seg {
ll val = INF;
ll l, r, mid; // responisble for [l,r)
Seg* lp, * rp;
Seg(ll l, ll r) : l(l), r(r), mid((l + r) / 2) {
if (l + 1 < r) {
lp = new Seg(l, mid);
rp = new Seg(mid, r);
}
}
void pull() {
val = lp->val ^ rp->val;
}
void update(ll i, ll x) {
if (l + 1 == r) {
val = x;
return;
}
if (i < mid) lp->update(i, x);
else rp->update(i, x);
pull();
}
ll query(ll a, ll b) { // xor of [a,b)
if (a >= r || b <= l) return 0; // [a,b) and [l,r) are disjoll
if (a <= l && r <= b) return val; // [l,r) is inside [a,b)
return lp->query(a, b) ^ rp->query(a, b);
}
};
int main() {
ll n, q;
cin >> n >> q;
Seg seg(0, n / 2 + 1);
Seg seg1(0, n / 2 + 1);
ll g;
for (ll i = 0; i < n; i++) {
cin >> g;
if ((i + 1) % 2 == 1) {
seg1.update(i / 2, g);
}
else
seg.update(i / 2, g);
}
while (q--) {
ll op;
cin >> op;
if (op == 1) {
ll i, j;
cin >> i >> j;
i--;
if ((i + 1) % 2 == 1)
seg1.update(i / 2, j);
else
seg.update(i / 2, j);
}
else {
ll l, r;
cin >> l >> r;
l--, r--;
if ((r - l + 1) % 2 == 0)
cout << 0 << endl;
else {
if ((l + 1) % 2 == 1) {
cout << seg1.query(l / 2, r / 2 + 1) << endl;
}
else {
cout << seg.query(l / 2, r / 2 + 1) << endl;
}
}
}
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |