Codeforces Round #365 (Div. 2) D. Mishka and Interesting sum

来源:互联网 发布:天地图图层数据标准 编辑:程序博客网 时间:2024/05/02 21:56

Little Mishka enjoys programming. Since her birthday has just passed, her friends decided to present her with array of non-negative integersa1, a2, ..., an ofn elements!

Mishka loved the array and she instantly decided to determine its beauty value, but she is too little and can't process large arrays. Right because of that she invited you to visit her and asked you to processm queries.

Each query is processed in the following way:

  1. Two integers l and r (1 ≤ l ≤ r ≤ n) are specified — bounds of query segment.
  2. Integers, presented in array segment [l,  r] (in sequence of integersal, al + 1, ..., ar)even number of times, are written down.
  3. XOR-sum of written down integers is calculated, and this value is the answer for a query. Formally, if integers written down in point 2 arex1, x2, ..., xk, then Mishka wants to know the value, where — operator of exclusive bitwise OR.

Since only the little bears know the definition of array beauty, all you are to do is to answer each of queries presented.

Input

The first line of the input contains single integer n (1 ≤ n ≤ 1 000 000) — the number of elements in the array.

The second line of the input contains n integersa1, a2, ..., an (1 ≤ ai ≤ 109) — array elements.

The third line of the input contains single integer m (1 ≤ m ≤ 1 000 000) — the number of queries.

Each of the next m lines describes corresponding query by a pair of integersl and r (1 ≤ l ≤ r ≤ n) — the bounds of query segment.

Output

Print m non-negative integers — the answers for the queries in the order they appear in the input.

Examples
Input
33 7 811 3
Output
0
Input
71 2 1 3 3 2 354 74 51 31 71 5
Output
03132
Note

In the second sample:

There is no integers in the segment of the first query, presented even number of times in the segment — the answer is0.

In the second query there is only integer 3 is presented even number of times — the answer is3.

In the third query only integer 1 is written down — the answer is1.

In the fourth query all array elements are considered. Only 1 and 2 are presented there even number of times. The answer is.

In the fifth query 1 and 3 are written down. The answer is .


题意:给你n个数,m个询问,每次询问一个区间的所有出现次数为偶数的数的异或和。


分析:我们很容易通过前缀异或和求出每个区间的奇数次数的异或和,然后再通过和这个区间所有不同数的异或和异或就是答案,区间不同数的异或和可以离线做:先按右端把所有询问排序,然后从左到右处理每个前缀,因为右端确定后,我们只需要知道当前每个数最后出现的位置就可以用树状数组求出所有询问。


#include<iostream>#include<string>#include<algorithm>#include<cstdlib>#include<cstdio>#include<set>#include<unordered_map>#include<vector>#include<cstring>#include<stack>#include<cmath>#include<queue>#include <map>#define INF 0x3f3f3f3f#define eps 1e-9#define MAXN 1000005using namespace std;struct thing{int x,y,num;friend bool operator < (thing a,thing b){return a.y < b.y;}} ask[MAXN];int n,m,x,y,a[MAXN],b[MAXN],f[MAXN],ans[MAXN],s[MAXN],pre[MAXN];int lowbit(int x){return x & (-x);}void Insert(int k,int x){while(k <= n){f[k] ^= x;k += lowbit(k);}}int Find(int k){int ans = 0;while(k){ans ^= f[k];k -= lowbit(k);}return ans;}int main(){scanf("%d",&n);for(int i = 1;i <= n;i++) {scanf("%d",&a[i]);s[i] = a[i];b[i] = b[i-1] ^ a[i];}scanf("%d",&m);for(int i = 1;i <= m;i++){scanf("%d%d",&x,&y);ask[i].x = x;ask[i].y = y;ask[i].num = i;}sort(ask+1,ask+1+m);sort(s+1,s+1+n);int pos = 0; for(int i = 1;i <= m;i++){while(pos < ask[i].y){pos++;int num = lower_bound(s+1,s+1+n,a[pos]) - s;if(pre[num]) Insert(pre[num],a[pos]);Insert(pos,a[pos]);pre[num] = pos;}ans[ask[i].num] = Find(pos) ^ Find(ask[i].x-1) ^ b[pos] ^ b[ask[i].x-1];}for(int i = 1;i <= m;i++) printf("%d\n",ans[i]);}


0 0
原创粉丝点击