记录编号 273839 评测结果 AAAAAAAAAA
题目名称 地球往事 最终得分 100
用户昵称 Gravatar再见 是否通过 通过
代码语言 C++ 运行时间 8.006 s
提交时间 2016-06-24 15:27:07 内存使用 142.58 MiB
显示代码纯文本
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define isdigit(x) (x>='0'&&x<='9')
#define isalpha(x) (x>='a'&&x<='z')
#define lc(o) o<<1
#define rc(o) o<<1|1

int _x;char ch,chr[40],top;
inline int read(){
	_x=0;
	while(ch=getchar(),!isdigit(ch));
	while(_x=_x*10+ch-48,ch=getchar(),isdigit(ch));
	return _x;
}

inline char cread(){
	while(ch=getchar(),!isalpha(ch));
	return ch;
}

inline void write(long long x){
	!x?putchar('0'):false;
	for(;x;chr[++top]=x%10+'0',x/=10);
	for(;top;putchar(chr[top--]));
	putchar('\n');
}

int n,val[100010];
inline int min(int a,int b){return a<b?a:b;}
inline int max(int a,int b){return a>b?a:b;}

class seg{	
	public:
		int cnt[800010],ql,qr,id,k;
		char setv[800010],add[800010];
		
		seg(){memset(setv,-1,sizeof(setv));}
		
		void build(int o,int l,int r){
			if(l==r){
				cnt[o]=(val[l]>>id)&1;
				return;
			}
			int mid=(l+r)>>1,llc=lc(o),rrc=rc(o);;
			build(llc,l,mid);
			build(rrc,mid+1,r);
			cnt[o]=cnt[llc]+cnt[rrc];
		}
		
		inline void pushdown(int o,int l,int r){
			int llc=lc(o),rrc=rc(o),mid=(l+r)>>1;
			if(setv[o]!=-1){
				add[llc]=add[rrc]=0;
				setv[llc]=setv[rrc]=setv[o];
				cnt[llc]=setv[o]*(mid-l+1);
				cnt[rrc]=setv[o]*(r-mid);
				setv[o]=-1;
			}
			if(add[o]){
				add[llc]^=add[o];add[rrc]^=add[o];
				cnt[llc]=mid-l+1-cnt[llc];
				cnt[rrc]=r-mid-cnt[rrc];
				add[o]=0;
			}
		}
		
		void Add(int o,int l,int r){
			if(ql<=l&&r<=qr){
				add[o]^=1;
				cnt[o]=r-l+1-cnt[o];
			}
			else{
				pushdown(o,l,r);
				int mid=(l+r)>>1;
				if(ql<=mid) Add(lc(o),l,mid);
				if(mid<qr) Add(rc(o),mid+1,r);
				cnt[o]=cnt[lc(o)]+cnt[rc(o)];
			}
		}
		
		void Set(int o,int l,int r){
			if(ql<=l&&r<=qr){
				setv[o]=k,add[o]=0;
				cnt[o]=setv[o]*(r-l+1);
			}
			else{
				pushdown(o,l,r);
				int mid=(l+r)>>1;
				if(ql<=mid) Set(lc(o),l,mid);
				if(mid<qr) Set(rc(o),mid+1,r);
				cnt[o]=cnt[lc(o)]+cnt[rc(o)];
			}
		}
		
		void change(int _k,int _l,int _r){
			k=_k;ql=_l;qr=_r;
			if(k==2) Add(1,1,n);
			else Set(1,1,n);
		}
		
		int qu(int o,int l,int r){
			if(ql<=l&&r<=qr) return cnt[o];
    		pushdown(o,l,r);  
    		int mid=(l+r)/2,ans=0;
    		if(ql<=mid) ans+=qu(lc(o),l,mid);  
    		if(mid<qr) ans+=qu(rc(o),mid+1,r);  
    		cnt[o]=cnt[lc(o)]+cnt[rc(o)]; 
    		return ans;
		}
		
		int query(int _l,int _r){
			ql=_l;qr=_r;
			return qu(1,1,n);
		}
		
}tree[31];

int main(){
	freopen("The_past_of_the_earth.in","r",stdin);
	freopen("The_past_of_the_earth.out","w",stdout);
	n=read();
	for(int i=1;i<=n;i++) val[i]=read();
	for(int i=0;i<=30;i++){
		tree[i].id=i;
		tree[i].build(1,1,n);
	}
	char ka;int l,r,x,bit;long long out;
	for(int i=1;i<=n;i++){
		ka=cread();l=read();r=read();
		switch(ka){
			case 'a':
				x=read();
				for(int i=0;i<=30;i++){
					bit=(x>>i)&1;
					if(!bit) tree[i].change(0,l,r); 
				}
				break;
			case 'o':
				x=read();
				for(int i=0;i<=30;i++){
					bit=(x>>i)&1;
					if(bit) tree[i].change(1,l,r); 
				}
				break;
			case 'x':
				x=read();
				for(int i=0;i<=30;i++){
					bit=(x>>i)&1;
					if(bit) tree[i].change(2,l,r); 
				}
				break;
			case 'q':
				out=0;
				for(int i=0;i<=30;i++)
					out+=(long long)tree[i].query(l,r)<<i;
				write(out);
				break;
		}
	}
	return 0;
}