线段树 Codeforces Round #197 (Div. 2) D. Xenia and Bit Operations

 

题目传送门

 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 }

 

你可能感兴趣的:(codeforces)