显示原始代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mxn = 3e5 + 10, mxm = 3e5 + 10;
struct sgt {
int n;
ll dta[4 * mxn];
static int kid(int id, int i) { return id * 2 + i; }
void set(int sz) { n = sz; }
void marge(int id) { dta[id] = dta[kid(id, 0)] ^ dta[kid(id, 1)]; }
void build(ll a[], int l = 0, int r = -1, int id = 1);
ll find(int l, int r, int gl = 0, int gr = -1, int id = 1);
void add(int loc, ll val, int l = 0, int r = -1, int id = 1);
} tr;
void sgt::build(ll a[], int l, int r, int id) {
r = r < 0 ? n : r;
if (l + 1 == r)
return dta[id] = 0, void();
int mid = l + r >> 1;
build(a, l, mid, kid(id, 0));
build(a, mid, r, kid(id, 1));
marge(id);
}
ll sgt::find(int l, int r, int gl, int gr, int id) {
gr = gr < 0 ? n : gr;
if (l == gl && r == gr)
return dta[id];
int mid = gl + gr >> 1;
if (r <= mid)
return find(l, r, gl, mid, kid(id, 0));
if (l >= mid)
return find(l, r, mid, gr, kid(id, 1));
return find(l, mid, gl, mid, kid(id, 0)) ^ find(mid, r, mid, gr, kid(id, 1));
}
void sgt::add(int loc, ll val, int l, int r, int id) {
r = r < 0 ? n : r;
if (l > loc || r <= loc)
return;
if (l + 1 == r)
return dta[id] ^= val, void();
int mid = l + r >> 1;
add(loc, val, l, mid, kid(id, 0));
add(loc, val, mid, r, kid(id, 1));
marge(id);
}
struct presum {
ll dta[mxn];
ll &operator[](int loc) { return dta[loc]; }
ll get(int l, int r) const { return dta[r] ^ dta[l]; }
} chi, tot;
map<ll, int> cnt, pre;
int nxt[mxn], ans[mxm];
vector<pair<int, int>> que[mxn];
ll a[mxn];
int main() {
int n, q;
cin >> n;
tr.set(n);
for (int i = 0; i < n; ++i) cin >> a[i];
for (int i = 0; i < n; ++i) {
chi[i + 1] = chi[i] ^ a[i];
if (cnt[a[i]])
tot[i + 1] = tot[i], nxt[pre[a[i]]] = i;
else
tot[i + 1] = tot[i] ^ a[i];
pre[a[i]] = i;
++cnt[a[i]];
}
cin >> q;
for (int i = 0; i < q; ++i) {
int l, r;
cin >> l >> r;
que[l - 1].push_back({ r, i });
}
for (int i = 0; i < n; ++i) {
for (const pair<int, int> &aq : que[i]) {
int r = aq.first, qi = aq.second;
ans[qi] = tot.get(i, r) ^ tr.find(i, r) ^ chi.get(i, r);
}
if (nxt[i])
tr.add(nxt[i], a[i]);
}
for (int i = 0; i < q; ++i) cout << ans[i] << endl;
return 0;
}