记录编号 |
273839 |
评测结果 |
AAAAAAAAAA |
题目名称 |
地球往事 |
最终得分 |
100 |
用户昵称 |
再见 |
是否通过 |
通过 |
代码语言 |
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;
}