Codeforces Round #197 (Div. 2) D. Xenia and Bit Operations(线段树)

来源:互联网 发布:mac可以玩守望先锋吗 编辑:程序博客网 时间:2024/05/18 20:51

题目地址:http://codeforces.com/problemset/problem/339/D

思路:线段树。PushUp时根据层数奇数偶数判断使用|还是^

#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <algorithm>using namespace std;#define maxn (1<<18)int a[maxn];int sum[maxn<<2];void PushUp(int rt,int dep){    if(dep) sum[rt] = sum[rt<<1]|sum[rt<<1|1];else sum[rt] = sum[rt<<1] ^ sum[rt<<1|1];}void build(int l,int r,int rt,int dep){if(l==r){sum[rt] = a[l];return;}int mid = (l+r)>>1;build(l,mid,rt<<1,dep^1);build(mid+1,r,rt<<1|1,dep^1);    PushUp(rt,dep);}void update(int p,int l,int r,int rt,int v,int dep){if(l==r){sum[rt]=v;return;}int mid = (l+r)>>1;if(p<=mid) update(p,l,mid,rt<<1,v,dep^1);else update(p,mid+1,r,rt<<1|1,v,dep^1);PushUp(rt,dep);}int main(){int n,m;scanf("%d%d",&n,&m);        int cnt= 1<<n;for(int i=1;i<=cnt;i++)scanf("%d",&a[i]);build(1,cnt,1,n&1);for(int i=1;i<=m;i++){    int p,v;scanf("%d%d",&p,&v);update(p,1,cnt,1,v,n&1);printf("%d\n",sum[1]);}return 0;}


0 0
原创粉丝点击