download:JAVA进阶训练营(2021最新版)
哪些人适合报名 Java 进阶训练营?
2 年及以上工作经验的 Java 工程师
面临瓶颈,急需突破的 Java 工程师
想升职加薪,进大厂的 Java 工程师
想建立自己的知识体系的 Java 工程师
Q:是否有基础要求?
你需要有 2 年以上的 Java 工作经验,掌握 Java 基础语法,并有相关的项目经验。
Q:课程学完后能到什么水平?
Java 进阶训练营课程设计对标阿里 P7,课程中的项目实战开发,不仅仅让你提升了 Java 编程技能,同时也会培养你进入一线互联网大厂必备的思维能力。
我们的课程培养目标是大厂的高级 Java 工程师、资深 Java 开发工程师、Java 技术专家和 Java 架构师,按照讲师的路径规划,用心努力学习,完成每一个实战项目,就可以具备成为 Java 架构师和进入一线大厂的能力。
//Don't act like a loser.//This code is written by huayucaiji//You can only use the code for studying or finding mistakes//Or,you'll be punished by Sakyamuni!!!#include<bits/stdc++.h>#define int long longusing namespace std;int read() { char ch=getchar(); int f=1,x=0; while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=x
10+ch-'0'; ch=getchar(); } return f
x;}const int MAXN=1e5+10;int n,m;int a[MAXN];struct seg_tree { int lazy,num[2][21];}s[MAXN<<2];void pushdown(int l,int r,int p) { if(l==r) { return ; } s[p<<1].lazy^=s[p].lazy; s[p<<1|1].lazy^=s[p].lazy; for(int i=0;i<=20;i++) { if(s[p].lazy&(1<<i)) { swap(s[p<<1].num[0][i],s[p<<1].num[1][i]); swap(s[p<<1|1].num[0][i],s[p<<1|1].num[1][i]); } } s[p].lazy=0;}void build(int l,int r,int p) { if(l==r) { for(int i=0;i<=20;i++) { s[p].num[a[l]&(1<<i)? 1:0][i]++; } s[p].lazy=0; return ; } int mid=(l+r)>>1; build(l,mid,p<<1); build(mid+1,r,p<<1|1); for(int i=0;i<=20;i++) { s[p].num[1][i]=s[p<<1].num[1][i]+s[p<<1|1].num[1][i]; s[p].num[0][i]=s[p<<1].num[0][i]+s[p<<1|1].num[0][i]; }}void modify(int l,int r,int p,int x,int y,int val) { pushdown(l,r,p); if(r<x||y<l) { return ; } if(x<=l&&r<=y) { for(int i=0;i<=20;i++) { if(val&(1<<i)) { swap(s[p].num[0][i],s[p].num[1][i]); } } s[p].lazy=val; return ; } int mid=(l+r)>>1; modify(l,mid,p<<1,x,y,val); modify(mid+1,r,p<<1|1,x,y,val); for(int i=0;i<=20;i++) { s[p].num[1][i]=s[p<<1].num[1][i]+s[p<<1|1].num[1][i]; s[p].num[0][i]=s[p<<1].num[0][i]+s[p<<1|1].num[0][i]; }}int query(int l,int r,int p,int x,int y) { pushdown(l,r,p); if(r<x||y<l) { return 0; } if(x<=l&&r<=y) { int ret=0; for(int i=0;i<=20;i++) { ret+=(1<<i)*s[p].num[1][i]; } return ret; } int mid=(l+r)>>1; return query(l,mid,p<<1,x,y)+query(mid+1,r,p<<1|1,x,y);}signed main() { cin>>n; for(int i=1;i<=n;i++) { a[i]=read(); } build(1,n,1); cin>>m; for(int i=1;i<=m;i++) { int opt=read(); if(opt==2) { int x=read(),y=read(),val=read(); modify(1,n,1,x,y,val); } else { int x=read(),y=read(); printf("%lld\n",query(1,n,1,x,y)); } } return 0;}