求助!样例全过10分
查看原帖
求助!样例全过10分
951886
niumachaoren楼主2024/9/11 16:37

如题

#include<bits/stdc++.h>
#define int long long
#define lx x<<1
#define rx x<<1|1
using namespace std;
const int maxn=1e5;
int n,q;
struct basis{
    int d[35];
    void insert(int x){
        for(int i=32;i>=0;i--){
            if(!(x&(1<<i)))continue;
            if(!d[i]){
                d[i]=x;
                return;
            }
            else x^=d[i];
        }
    }
    int query(int x){
        int ans=x;
        for(int i=32;i>=0;i--)ans=max(ans,ans^d[i]);
        return ans;
    }
    void clear(){
        memset(d,0,sizeof(d));
    }
    void operator+=(basis a){
        for(int i=32;i>=0;i--)if(a.d[i])insert(a.d[i]); 
    }
};
struct tree{
    int l,r;
    basis val;
}tr[maxn<<2];
void build(int x,int l,int r){
    tr[x].l=l,tr[x].r=r;
    if(l==r)return ;
    int mid=(l+r)>>1;
    build(lx,l,mid);
    build(rx,mid+1,r);
}
void add(int x,int p,int k){
    tr[x].val.insert(k);
    if(tr[x].l==tr[x].r)return ;
    int mid=(tr[x].l+tr[x].r)>>1;
    if(p<=mid)add(lx,p,k);
    else add(rx,p,k);
}
basis ans;
void ask(int x,int l,int r){
    if(tr[x].l>r||tr[x].r<l)return ;
    if(l<=tr[x].l&&tr[x].r<=r){
        ans+=tr[x].val;
        return ;
    }
    int mid=(tr[x].l+tr[x].r)>>1;
    if(mid<=r)ask(lx,l,r);if(mid>l)ask(rx,l,r);
}
signed main(){
    cin>>q>>n;
    build(1,1,n);
    for(int i=1;i<=q;i++){
        int opt,l,r;
        cin>>opt>>l>>r;
        if(opt==1){
            add(1,l,r);
        }
        else{
            ans.clear();
            ask(1,l,r);
            cout<<ans.query(0)<<'\n';
        }
    }
    return 0;
}
2024/9/11 16:37
加载中...