做法:先考虑不在线,把询问挂在右端点上面,扫描右端点,动态维护一个左端点到当前的点的区间卜同数xor和。在线就主席树,然后标记永久化,现在会TLE,开打了还会MLE
求卡QAQ
#include<bits/stdc++.h>
// #define ONLINE_JUDGE
#define INPUT_DATA_TYPE int
#define OUTPUT_DATA_TYPE int
INPUT_DATA_TYPE read(){register INPUT_DATA_TYPE x=0;register char f=0,c=getchar();while(c<'0'||'9'<c)f=(c=='-'),c=getchar();while('0'<=c&&c<='9')x=(x<<3)+(x<<1)+(c&15),c=getchar();return f?-x:x;}void print(OUTPUT_DATA_TYPE x){if(x<0)x=-x,putchar('-');if(x>9)print(x/10);putchar(x%10^48);return;}
namespace Fread {
const int SIZE = 1 << 21;
char buf[SIZE], *S, *T;
inline char getchar() {
if (S == T) {
T = (S = buf) + fread(buf, 1, SIZE, stdin);
if (S == T) return '\n';
}
return *S++;
}
}
namespace Fwrite {
const int SIZE = 1 << 21;
char buf[SIZE], *S = buf, *T = buf + SIZE;
inline void flush() {
fwrite(buf, 1, S - buf, stdout);
S = buf;
}
inline void putchar(char c) {
*S++ = c;
if (S == T) flush();
}
struct NTR {
~ NTR() { flush(); }
} ztr;
}
#ifdef ONLINE_JUDGE
#define getchar Fread :: getchar
#define putchar Fwrite :: putchar
#endif
namespace Fastio {
struct Reader {
template<typename T>
Reader& operator >> (T& x) {
char c = getchar();
T f = 1;
while (c < '0' || c > '9') {
if (c == '-') f = -1;
c = getchar();
}
x = 0;
while (c >= '0' && c <= '9') {
x = x * 10 + (c - '0');
c = getchar();
}
x *= f;
return *this;
}
Reader& operator >> (char& c) {
c = getchar();
while (c == ' ' || c == '\n') c = getchar();
return *this;
}
Reader& operator >> (char* str) {
int len = 0;
char c = getchar();
while (c == ' ' || c == '\n') c = getchar();
while (c != ' ' && c != '\n' && c != '\r') { // \r\n in windows
str[len++] = c;
c = getchar();
}
str[len] = '\0';
return *this;
}
Reader(){}
} cin;
const char endl = '\n';
struct Writer {
template<typename T>
Writer& operator << (T x) {
if (x == 0) { putchar('0'); return *this; }
if (x < 0) { putchar('-'); x = -x; }
static int sta[45];
int top = 0;
while (x) { sta[++top] = x % 10; x /= 10; }
while (top) { putchar(sta[top] + '0'); --top; }
return *this;
}
Writer& operator << (char c) {
putchar(c);
return *this;
}
Writer& operator << (char* str) {
int cur = 0;
while (str[cur]) putchar(str[cur++]);
return *this;
}
Writer& operator << (const char* str) {
int cur = 0;
while (str[cur]) putchar(str[cur++]);
return *this;
}
Writer(){}
} cout;
}
#define cin Fastio :: cin
#define cout Fastio :: cout
#define endl Fastio :: endl
#define lc (tree[(p)].lChild)
#define rc (tree[(p)].rChild)
const int PSEG_DATA_SIZE=1000010;
const int PSEG_SIZE=PSEG_DATA_SIZE*16;
struct PSEGTREE_NODE{
int data,lChild,rChild;
};
struct PSEGTREE{
PSEGTREE_NODE tree[PSEG_SIZE];
int root[PSEG_DATA_SIZE],tot,L,R;
int getMem(){
return tot++;
}
int build_(int l,int r){
int p=getMem();
if(l==r) tree[p].data=0;
else{
int mid=(l+r)>>1;
tree[p].lChild=build_(l,mid);
tree[p].rChild=build_(mid+1,r);
}
return p;
}
int query(int p,int pos,int l,int r){
if(l==r) return tree[p].data;
int mid=(l+r)>>1;
return (pos<=mid?query(lc,pos,l,mid):query(rc,pos,mid+1,r))^tree[p].data;
}
int modify(int old,int l,int r,int s,int t,int c){
int p=getMem();
tree[p]=tree[old];
if(s<=l&&r<=t) tree[p].data^=c;
else{
int mid=(l+r)>>1;
if(s<=mid) tree[p].lChild=modify(tree[p].lChild,l,mid,s,t,c);
if(mid<t) tree[p].rChild=modify(tree[p].rChild,mid+1,r,s,t,c);
}
return p;
}
void build(int l,int r){
root[0]=build_(L=l,R=r);
return;
}
void modify(int oldVer,int newVer,int l,int r,int tag){
root[newVer]=modify(root[oldVer],L,R,l,r,tag);
}
int query(int ver,int pos){return query(root[ver],pos,L,R);}
}pseg;
int arr[1000010],xorsum[1000010];
std::map<int,int> latPos;
int main(){
#ifndef ONLINE_JUDGE
freopen("name.in", "r", stdin);
freopen("name.out", "w", stdout);
#endif
register int i,l,r;
int n;
cin>>n;
for(i=1;i<=n;++i){
cin>>arr[i];
xorsum[i]=xorsum[i-1]^(arr[i]);
}
pseg.build(1,n);
for(i=1;i<=n;++i){
pseg.modify(i-1,i,latPos[arr[i]]+1,i,arr[i]);
latPos[arr[i]]=i;
}
int q;
cin>>q;
for(i=0;i<q;++i){
cin>>l>>r;
cout<<(pseg.query(r,l)^xorsum[r]^xorsum[l-1])<<'\n';
}
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return 0;
}