首页 > 代码库 > 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;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。