求助线段树
查看原帖
求助线段树
174806
xbb2楼主2022/8/16 15:46
/*	Name:CF242E
	Copyright:[Xcoi]
	Author:xbb2
	Date:2022.8.15
	Description:*/
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
//const int mod;
int a[N];
struct tree{
	int d[N],b[N],k;
	inline void build(int s,int t,int p){
		if(s==t){d[p]=((a[s]>>k)&1);return ;}
		int m=s+((t-s)>>1);
		build(s,m,p*2),build(m+1,t,p*2+1);
		d[p]=d[p*2]+d[p*2+1];
	}
	inline void update(int l,int r,int c,int s,int t,int p){
		if(l<=s&&t<=r){d[p]=(c==1)?t-s+1-d[p]:d[p],b[p]=c;return ;}
		int m=s+((t-s)>>1);
		if(b[p]){
			d[p*2]=m-s+1-d[p*2],b[p*2]=b[p];
			d[p*2+1]=t-m-d[p*2+1],b[p*2+1]=b[p];
			b[p]=0;
		}
		if(l<=m)update(l,r,c,s,m,p*2);
		if(m<r)	update(l,r,c,m+1,t,p*2+1);
		d[p]=d[p*2]+d[p*2+1];
	}
	inline long long getans(int l,int r,int s,int t,int p){
		if(l<=s&&t<=r){return d[p];}
		int m=s+((t-s)>>1),ans=0;
		if(b[p]){
			d[p*2]=m-s+1-d[p*2],b[p*2]=b[p];
			d[p*2+1]=t-m-d[p*2+1],b[p*2+1]=b[p];
			b[p]=0;
		}
		if(l<=m)ans+=getans(l,r,s,m,p*2);
		if(m<r)	ans+=getans(l,r,m+1,t,p*2+1);
		return ans;
	}
}T[25];
int n,m;
int main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	for(int i=0;i<=22;i++)T[i].k=i,T[i].build(1,n,1);
	cin>>m;
	for(int ll=1;ll<=m;ll++){
		int op,l,r,k;scanf("%d%d%d",&op,&l,&r);
		if(op==1){
			long long ans=0;
			for(int i=0;i<=22;i++)ans+=(((long long)(T[i].getans(l,r,1,n,1)))<<i);
			printf("%lld\n",ans);
		}
		else{
			scanf("%d",&k);
			for(int i=0;i<=22;i++)T[i].update(l,r,((k>>i)&1),1,n,1);
		}
	}
	return 0;
}

2022/8/16 15:46
加载中...