萌新妹子刚学 OI,简单线段树在线求调
查看原帖
萌新妹子刚学 OI,简单线段树在线求调
532992
Blikewsr楼主2024/10/4 19:20

代码作者 @ALL_FallsDown, 他让我发帖

悬赏关注

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,tree[1000005],a[100005],m,f[1000005];
void build(int x,int y,int p){
    if(x==y){
        tree[p]=a[x];
        return ;
    }
    int mid=(x+y)/2;
    build(x,mid,p*2);
    build(mid+1,y,p*2+1);
    tree[p]=tree[p*2]+tree[p*2+1];
}
void change(int x,int y,int s,int t,int w,int p){
    if(x>=s&&y<=t){
        f[p]^=w;
        return ;
    }
    if(f[p]!=0){
        f[p*2]^=f[p];
        f[p*2+1]^=f[p];
        f[p]=0;
    }
    int mid=(x+y)/2;
    if(mid>=s) change(x,mid,s,t,w,p*2);
    if(mid<t) change(mid+1,y,s,t,w,p*2+1);
}
int find(int x,int y,int s,int t,int p){
    if(x==y){
        if(f[p]!=0){tree[p]^=f[p]; f[p]=0;}
        return tree[p];
    }
    if(f[p]!=0){
        f[p*2]^=f[p];
        f[p*2+1]^=f[p];
        f[p]=0;
    }
    int mid=(x+y)/2,sum=0;
    if(mid>=s) sum=find(x,mid,s,t,p*2);
    if(mid<t) sum+=find(mid+1,y,s,t,p*2+1);
    return sum;
}
signed main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    build(1,n,1);
    cin>>m;
    for(int i=1;i<=m;i++){
        int k;
        cin>>k;
        if(k==1){
            int l,r;
            cin>>l>>r;
            cout<<find(1,n,l,r,1)<<endl;
        }
        if(k==2){
            int l,r,x;
            cin>>l>>r>>x;
            change(1,n,l,r,x,1);
        }
    }
    return 0;
}
2024/10/4 19:20
加载中...