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