CS Course
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 112 Accepted Submission(s): 66
Problem Description
Little A has come to college and majored in Computer and Science.
Today he has learned bit-operations in Algorithm Lessons, and he got a problem as homework.
Here is the problem:
You are giving n non-negative integers a1,a2,?,an, and some queries.
A query only contains a positive integer p, which means you
are asked to answer the result of bit-operations (and, or, xor) of all the integers except ap.
Input
There are no more than 15 test cases.
Each test case begins with two positive integers n and p
in a line, indicate the number of positive integers and the number of queries.
2≤n,q≤105
Then n non-negative integers a1,a2,?,an follows in a line, 0≤ai≤109 for each i in range[1,n].
After that there are q positive integers p1,p2,?,pqin q lines, 1≤pi≤n for each i in range[1,q].
Output
For each query p, output three non-negative integers indicates the result of bit-operations(and, or, xor) of all non-negative integers except ap in a line.
Sample Input
3 3
1 1 1
1
2
3
Sample Output
1 1 0
1 1 0
1 1 0
Source
1 //2017-08-31 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #define ll long long 6 #define mid ((st[id].l+st[id].r)>>1) 7 #define lson (id<<1) 8 #define rson ((id<<1)|1) 9 10 using namespace std; 11 12 const int N = 150000; 13 int arr[N]; 14 struct Node{ 15 int l, r, OR, XOR, AND; 16 }st[N<<3]; 17 18 void build(int id, int l, int r) 19 { 20 st[id].l = l; st[id].r = r; 21 if(l == r){ 22 st[id].OR = arr[l]; 23 st[id].AND = arr[l]; 24 st[id].XOR = arr[l]; 25 return; 26 } 27 build(lson, l, mid); 28 build(rson, mid+1, r); 29 st[id].OR = st[lson].OR | st[rson].OR; 30 st[id].XOR = st[lson].XOR ^ st[rson].XOR; 31 st[id].AND = st[lson].AND & st[rson].AND; 32 } 33 34 int query(int id, int l, int r, int op){ 35 if(st[id].l == l && st[id].r == r){ 36 if(op == 1)return st[id].OR; 37 if(op == 2)return st[id].XOR; 38 if(op == 3)return st[id].AND; 39 } 40 if(l > mid)return query(rson, l, r, op); 41 else if(r <= mid)return query(lson, l, r, op); 42 else{ 43 if(op == 1)return query(lson, l, mid, op) | query(rson, mid+1, r, op); 44 if(op == 2)return query(lson, l, mid, op) ^ query(rson, mid+1, r, op); 45 if(op == 3)return query(lson, l, mid, op) & query(rson, mid+1, r, op); 46 } 47 } 48 49 int main() 50 { 51 int n, q; 52 while(scanf("%d%d", &n, &q)!=EOF) 53 { 54 for(int i = 1; i <= n; i++) 55 scanf("%d", &arr[i]); 56 build(1, 1, n); 57 int p; 58 while(q--){ 59 scanf("%d", &p); 60 if(p == 1) 61 printf("%d %d %d\n", query(1, 2, n, 3), query(1, 2, n, 1), query(1, 2, n, 2)); 62 else if(p == n) 63 printf("%d %d %d\n", query(1, 1, n-1, 3), query(1, 1, n-1, 1), query(1, 1, n-1, 2)); 64 else 65 printf("%d %d %d\n", query(1, 1, p-1, 3)&query(1, p+1, n, 3), query(1, 1, p-1, 1)|query(1, p+1, n, 1), query(1, 1, p-1, 2)^query(1, p+1, n, 2)); 66 } 67 } 68 69 return 0; 70 }