显示原始代码
#include <iostream>
#include <vector>
#include <map>
#include <cmath>
#include <set>
#include <algorithm>
using namespace std;
using ll = long long;
constexpr int MAX_N = 3e5 + 7;
int bit[MAX_N];
int n, m;
int lowbit(int x) { return x & (-x); }
void update(int x, int y) {
for (; x <= n; x += lowbit(x)) bit[x] ^= y;
}
int get(int x) {
int res = 0;
for (; x > 0; x -= lowbit(x)) res ^= bit[x];
return res;
}
struct Node {
int l, r, idx;
Node(int _l = 0, int _r = 0, int _idx = 0) : l(_l), r(_r), idx(_idx) {}
bool operator<(const Node &u) const {
if (r < u.r)
return true;
if (r > u.r)
return false;
return l < u.l;
}
};
signed main() {
ios::sync_with_stdio(false);
cin >> n;
vector<int> a(n), s(n + 1, 0);
for (int i = 0; i < n; i++) {
cin >> a[i];
s[i + 1] = a[i] ^ s[i];
}
vector<Node> qs;
cin >> m;
for (int i = 0; i < m; i++) {
int l, r;
cin >> l >> r;
--l;
qs.emplace_back(l, r, i);
}
sort(qs.begin(), qs.end());
vector<int> ans(m);
int i = 0;
map<int, int> mp;
for (auto [l, r, idx] : qs) {
while (i < n && i < r) {
if (mp.count(a[i])) {
update(mp[a[i]], a[i]);
}
mp[a[i]] = i + 1;
update(i + 1, a[i]);
i++;
}
ans[idx] = get(r) ^ get(l) ^ s[r] ^ s[l];
}
for (int i = 0; i < m; i++) {
cout << ans[i] << "\n";
}
return 0;
}