1. 程式人生 > 實用技巧 >Codeforces 339D-Xenia and Bit Operations(線段樹)

Codeforces 339D-Xenia and Bit Operations(線段樹)

傳送門

  • 還是比較明顯的線段樹的操作
#include<bits/stdc++.h>
using namespace std;

const int N=2e6+10;
int a[N];
int tn,m,n;

struct stree{
    int id,num;
    
}tree[N<<2];

int ls(int x) {return x<<1;}
    int rs(int x) {return x<<1|1;}

    void pushup(int rt)
    {
        tree[rt].id=tree[ls(rt)].id^1;
        if(tree[rt].id==1){
            tree[rt].num=tree[ls(rt)].num|tree[rs(rt)].num;
            return;
        }else{
            tree[rt].num=tree[ls(rt)].num^tree[rs(rt)].num;
        }
    }

    void build(int rt,int l,int r)
    {
        if(l==r){
            tree[rt].num=a[l];
            tree[rt].id=0;
            return;
        }
        int mid=(l+r)/2;
        build(ls(rt),l,mid);
        build(rs(rt),mid+1,r);
        pushup(rt);
    }

    void update(int rt,int Id,int num,int l,int r)
    {
        if(l==r&&l==Id){
            tree[rt].num=num;
            return;
        }
        int mid=(l+r)/2;
        if(Id<=mid) update(ls(rt),Id,num,l,mid);
        else update(rs(rt),Id,num,mid+1,r);
        pushup(rt);
    }

    int queryFirst(int rt)
    {
        return tree[rt].num;
    }

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>tn>>m;
    n=pow(2,tn);
    for(int i=1;i<=n;++i) cin>>a[i];
    build(1,1,n);
    for(int i=0;i<m;++i){
        int p,b;
        cin>>p>>b;
        a[p]=b;
        update(1,p,b,1,n);
        cout<<queryFirst(1)<<"\n";
    }
    return 0;
}