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;
}

 

posted on 2014-08-12 14:46  一个西瓜  阅读(159)  评论(0编辑  收藏  举报

导航