LG5312 竞赛实验班

#include<bits/stdc++.h>
#define forUp(i,a,b) for(int i=(a);i<=(b);++i)
#define forUP(i,a,b) for(int i=(a);i<(b);++i)
#define forDown(i,a,b) for(int i=(a);i>=(b);--i)
#define forG(u,v) for(int __i=head[u],v=to[__i];__i;__i=nxt[__i],v=to[__i])
#define forWG(u,v,c) for(int __i=head[u],v=to[__i],c=w[__i];__i;__i=nxt[__i],v=to[__i],c=w[__i])
#define pushb push_back
#define popb pop_back
#define pushf push_front
#define popf pop_front
#define popc __builtin_popcount
#define popc64 __builtin_popcountll
#define seteps(n) fixed<<setprecision(n)
bool __mst;using uint=unsigned int;using int64=long long;using uint64=unsigned long long;using int128=__int128;using uint128=unsigned __int128;using float64=double;using float80=long double;
constexpr int INF=0x3f3f3f3f,MINF=0xcfcfcfcf;constexpr int64 INF64=0x3f3f3f3f3f3f3f3f,MINF64=0xcfcfcfcfcfcfcfcf;constexpr float64 INFDB=1e50,eps=1e-6;
template<class _Tp>inline void chkMax(_Tp &x,const _Tp &y){if(x<y)x=y;}template<class _Tp>inline void chkMin(_Tp &x,const _Tp &y){if(x>y)x=y;}
inline int addMod(const int &x,const int &y,const int mod){int ans=x+y;return ans>=mod?ans-mod:ans;}inline int subMod(const int &x,const int &y,const int mod){int ans=x-y;return ans<0?ans+mod:ans;}
constexpr int N=2e5+10,L=(N<<4)+10;int __test_num=1,__task_id,__tst;using namespace std;void __init();

int n,q,p,A[N];

int xortag,tag[30],pre[30][N],tot=1,to[L][2],sz[L],sum[L][30];
void insert(int val){
	int cur=1;
	forDown(i,29,0){
		int c=val>>i&1;
		if(!to[cur][c])to[cur][c]=++tot;
		cur=to[cur][c],++sz[cur];
		forUP(k,0,30)sum[cur][k]+=val>>k&1;
	}
}
int64 ask(int pos){
	if(pos==0)return 0;
	int cur=1,rank=min(pos,p),val=0;int64 ans=0;
	forDown(i,29,0){
		int c=tag[i];
		if(rank<=sz[to[cur][c]])cur=to[cur][c],val|=c<<i;
		else{
			int x=sz[to[cur][c]];
			rank-=x;
			forUP(k,0,30){
				int cnt=sum[to[cur][c]][k];
				if(xortag>>k&1)cnt=x-cnt;
				ans+=((int64)cnt)<<k;
			}
			val|=(c^1)<<i,cur=to[cur][c^1];
		}
	}
	ans+=1ll*rank*(val^xortag);
	if(pos>p){
		forDown(i,29,0){
			int cnt=pre[i][pos]-pre[i][p];
			if(xortag>>i&1)cnt=(pos-p)-cnt;
			ans+=((int64)cnt)<<i;
		}
	}
	return ans;
}

bool __med;void __solve(int __test_id){
	cin>>n;
	forUp(i,1,n){
		cin>>A[i];
		forDown(k,29,0)pre[k][i]=pre[k][i-1]+(A[i]>>k&1);
	}
	cin>>q;
	while(q--){
		int op;cin>>op;
		if(op==1){
			int x;cin>>x;x^=xortag;
			A[n+1]=x;forDown(i,29,0)pre[i][n+1]=pre[i][n]+(x>>i&1);
			++n;
		}
		if(op==2){
			int l,r;cin>>l>>r;
			cout<<ask(r)-ask(l-1)<<'\n';
		}
		if(op==3){
			int x;cin>>x;
			xortag^=x;
		}
		if(op==4){
			forUp(pos,p+1,n)insert(A[pos]);
			forDown(i,29,0)tag[i]=xortag>>i&1;
			p=n;
		}
	}
}
signed main(){
	__init();
	forUp(i,1,__test_num)__solve(i);
	cerr<<1000.0*(clock()-__tst)/CLOCKS_PER_SEC<<"ms "<<((&__mst)-(&__med))/1024.0/1024.0<<"MB"<<'\n';
	return 0;
}
void __init(){
	__tst=clock();
	#ifndef use_file
	//#define use_file
	#endif
	#ifdef use_file
	const string __file_name="test";freopen((__file_name+".in").c_str(),"r",stdin);freopen((__file_name+".out").c_str(),"w",stdout);
	#endif
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	//scanf("%d",&__test_num);
	//cin>>__test_num;
}
posted @ 2026-03-13 13:32  LXcjh4998  阅读(1)  评论(0)    收藏  举报