zoukankan      html  css  js  c++  java
  • 线段树 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
    ", node[1].v);
    84     }
    85 
    86     return 0;
    87 }
    编译人生,运行世界!
  • 相关阅读:
    Windows XP中万能断点
    c#运算符 ?
    转神秘的程序员
    经典解决“线程间操作无效
    文件上传
    dowload.aspx
    mail
    js 正则
    新年快乐
    DataTable Compute
  • 原文地址:https://www.cnblogs.com/Running-Time/p/4402189.html
Copyright © 2011-2022 走看看