1 /* 2 线段树的单点更新:有一个交叉更新,若rank=1,or;rank=0,xor 3 详细解释:http://www.xuebuyuan.com/1154895.html 4 */ 5 #include <cstdio> 6 #include <iostream> 7 #include <algorithm> 8 #include <cstring> 9 #include <string> 10 #include <cmath> 11 #include <set> 12 #include <map> 13 using namespace std; 14 #define lson l, mid, rt << 1 15 #define rson mid+1, r, rt << 1 | 1 16 17 const int MAXN = 1 << 17 | 1; 18 const int INF = 0x3f3f3f3f; 19 struct NODE 20 { 21 int v, mx, mn, sum; 22 int rank; 23 }node[MAXN << 2]; 24 25 void push_up(int rt) 26 { 27 if (node[rt<<1].rank == 1) 28 { 29 node[rt].rank = 0; 30 node[rt].v = node[rt<<1].v | node[rt<<1|1].v; 31 } 32 else 33 { 34 node[rt].rank = 1; 35 node[rt].v = node[rt<<1].v ^ node[rt<<1|1].v; 36 } 37 } 38 39 40 void build(int l, int r, int rt) 41 { 42 if (l == r) 43 { 44 scanf ("%d", &node[rt].v); 45 node[rt].rank = 1; 46 return ; 47 } 48 int mid = (l + r) >> 1; 49 build (lson); 50 build (rson); 51 52 push_up (rt); 53 } 54 55 void updata(int p, int b, int l, int r, int rt) 56 { 57 if (l == r) 58 { 59 node[rt].v = b; 60 return ; 61 } 62 int mid = (l + r) >> 1; 63 if (p <= mid) updata (p, b, lson); 64 else updata (p, b, rson); 65 66 push_up (rt); 67 } 68 69 70 int main(void) //Codeforces Round #197 (Div. 2) D. Xenia and Bit Operations 71 { 72 //freopen ("H.in", "r", stdin); 73 74 int n, m; 75 scanf ("%d%d", &n, &m); 76 build (1, 1<<n, 1); 77 78 int p, b; 79 for (int i=1; i<=m; ++i) 80 { 81 scanf ("%d%d", &p, &b); 82 updata (p, b, 1, 1<<n, 1); 83 printf ("%d\n", node[1].v); 84 } 85 86 return 0; 87 }
时间: 2024-11-06 19:50:07