CF339D Xenia and Bit Operations线段树

把区间和改成,第一层|,第二层 ^。

每次给出一个x,y

把 第x个变成y  ,输出 sum[1];

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <string>
#include <iostream>
#include <map>
#include <cstdlib>
#include <list>
#include <set>
#include <queue>
#include <stack>
#include<math.h>
using namespace std;

#define lson l,mid,rt<<1,len+1
#define rson mid+1,r,rt<<1|1,len+1
int n;
int sum[1<<18];
void build(int l,int r,int rt,int len)
{
    if(l==r){
        scanf("%d",&sum[rt]);
        return ;
    }
    int mid=(l+r)>>1;
    build(lson);build(rson);
    if((n-len)&1) sum[rt]=sum[rt<<1]^sum[rt<<1|1];
    else sum[rt]=sum[rt<<1]|sum[rt<<1|1];
  //  printf("%d %d %d %d",len&1,rt,sum[rt<<1],sum[rt<<1|1]);system("pause");
}

void update(int pos,int add,int l,int r,int rt,int len)
{
    if(l==r){
        sum[rt]=add;
        return ;
    }
    int mid=(l+r)>>1;
    if(pos<=mid) update(pos,add,lson);
    else update(pos,add,rson);
    if((n-len)&1) sum[rt]=sum[rt<<1]^sum[rt<<1|1];
    else sum[rt]=sum[rt<<1]|sum[rt<<1|1];
}
int main()
{
    int t;
    int a;int b;
    scanf("%d",&n); scanf("%d",&t);
    int  m = 1<<n;
 //   cout<<m<<" "<<n<<endl;system("pause");
    build(1,m,1,1);
   // cout<<sum[1]<<endl;
   // system("pause");
    for(int i = 0 ;i< t;i++){
        scanf("%d%d",&a,&b);
        update(a,b,1,m,1,1);
        printf("%d\n",sum[1]);
    }
    return 0;
}

CF339D Xenia and Bit Operations线段树

时间: 2024-10-28 14:47:26

CF339D Xenia and Bit Operations线段树的相关文章

codeforces 339C Xenia and Bit Operations(线段树水题)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Xenia and Bit Operations Xenia the beginner programmer has a sequence a, consisting of 2n non-negative integers: a1, a2, ..., a2n. Xenia is currently studying bit operations. To better unders

codeforces 339D Xenia and Bit Operations 线段树裸题

题目链接 题意: 给定n,下面2^n个数. 第一次 把 a1|a2, a3|a4, 如此得到一个 2^(n-1)个数的序列. 再把这个序列 a1^a2, a3^a4 , 得到一个2^(n-2) 个数的序列 再进行 a1|a2, a3|a4 ··· 直到只剩下一个数v, 我们称v是这个2^n 序列的权值. 下面m个询问: 询问格式: p, b 表示 a[p] = b; 再输出此时序列的权值. 思路:因为这个序列一定是2的倍数,所以用线段树直接这样操作即可.push_up时的深度奇偶来判断此时应该用

UVA11992 - Fast Matrix Operations ( 线段树 + 区间修改 + 好题 )

UVA11992 - Fast Matrix Operations ( 线段树 + 区间修改 + 好题 ) 这是大白书上的例题,一直放着没有去A掉,这是一道线段树区间修改的好题. 线段树中需要维护三个域 ,max, min, sum,也就是区间最大值,最小值,区间和 题目大意: r 行 c 列 的全0矩阵,支持三个操作 1 x1 y1 x2 y2 v 子矩阵(x1,y1,x2,y2)的所有元素增加v 2 x1 y1 x2 y2 v 子矩阵(x1,y1,x2,y2)的所有元素设为v 3 x1 y1

CF339D Xenia and Bit Operations(线段树)

乱搞线段树,单点修改,每次询问整个表达式的值 不同点在于up函数需要进行修改,根据区间长度不同运算符号也有所不同 代码: #include <bits/stdc++.h> #define int long long #define sc(a) scanf("%lld",&a) #define scc(a,b) scanf("%lld %lld",&a,&b) #define sccc(a,b,c) scanf("%lld

cf339d Xenia and Bit Operations

Xenia and Bit Operations Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 339D Description Xenia the beginner programmer has a sequence a, consisting of 2n non-negative integers: a1, a2, 

UVa 11992 Fast Matrix Operations (线段树)

Fast Matrix Operations Description There is a matrix containing at most 106 elements divided into r rows and c columns. Each element has a location (x, y) where 1 ≤ x ≤ r, 1 ≤ y ≤ c. Initially, all the elements are zero. You need to handle four kinds

UVA11992 - Fast Matrix Operations(线段树区间修改)

题目链接 题目大意:给你个r*c的矩阵,初始化为0. 然后给你三种操作: 1 x1, y1, x2, y2, v 把由x1,y1, x2, y2构成的子矩阵里的每个元素都加上v. 2 x1, y1, x2, y2, v 把这个子矩阵的每个元素都修改为v. 3 x1, y1, x2, y2 查询这个子矩阵的元素之和,和这些元素的最大值和最小值. 解题思路:因为矩阵的行最多20行,所以可以将这个矩阵的元素构建一棵线段树,每个节点都有三个附加信息:sum,Max_num, Min_num.然后修改查询

HDU-DuoXiao第二场hdu 6315 Naive Operations 线段树

hdu 6315 题意:对于一个数列a,初始为0,每个a[ i ]对应一个b[i],只有在这个数字上加了b[i]次后,a[i]才会+1. 有q次操作,一种是个区间加1,一种是查询a的区间和. 思路:线段树,一开始没用lazy,TLE了,然后开始想lazy的标记,这棵线段树的特点是,每个节点维护 :一个区间某个a 要增加1所需个数的最小值,一个区间已加上的mx的最大值标记,还有就是区间和sum. (自己一开始没有想到mx标记,一度想把lazy传回去. (思路差一点就多开节点标记. #include

HDU - 6315(2018 Multi-University Training Contest 2) Naive Operations (线段树区间操作)

http://acm.hdu.edu.cn/showproblem.php?pid=6315 题意 a数组初始全为0,b数组为1-n的一个排列.q次操作,一种操作add给a[l...r]加1,另一种操作query查询Σfloor(ai/bi)(i=l...r). 分析 真的是太naive啦,现场时没做出来. 看见区间自然想起线段树,那么这里的关键就是整除问题,只有达到一定数量才会对区间和产生影响. 反过来想,先把a[i]置为b[i],那么每次add时就是-1操作,当a[i]为0时区间和+1,再把