首页 > 代码库 > CF339D Xenia and Bit Operations线段树

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+1int 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;}