把区间和改成,第一层|,第二层 ^。
每次给出一个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