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;

}

 

你可能感兴趣的:(Opera)