记录编号 367670 评测结果 AAAAAAAAAA
题目名称 简单题 最终得分 100
用户昵称 GravatarAntiLeaf 是否通过 通过
代码语言 C++ 运行时间 17.402 s
提交时间 2017-02-01 11:15:48 内存使用 7.94 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=200010,B=1213;
int d;
struct node{
	int x[2],l[2],r[2],w,sum;
	node *ch[2];
	bool operator<(const node &a)const{return x[d]<a.x[d];}
	void refresh(){
		sum=ch[0]->sum+ch[1]->sum+w;
		l[0]=min(x[0],min(ch[0]->l[0],ch[1]->l[0]));
		l[1]=min(x[1],min(ch[0]->l[1],ch[1]->l[1]));
		r[0]=max(x[0],max(ch[0]->r[0],ch[1]->r[0]));
		r[1]=max(x[1],max(ch[0]->r[1],ch[1]->r[1]));
	}
}null[maxn],*root=null;
void build(int,int,int,node*&);
void query(node*);
int l[2],r[2],x[B+10][2],w[B+10];
int n,op,ans=0,cnt=0,tmp=0;
int main(){
	freopen("bzoj_4066.in","r",stdin);
	freopen("bzoj_4066.out","w",stdout);
	null->l[0]=null->l[1]=10000000;
	null->r[0]=null->r[1]=-10000000;
	null->sum=0;
	null->ch[0]=null->ch[1]=null;
	scanf("%*d");
	while(scanf("%d",&op)==1&&op!=3){
		if(op==1){
			tmp++;
			scanf("%d%d%d",&x[tmp][0],&x[tmp][1],&w[tmp]);
			x[tmp][0]^=ans;x[tmp][1]^=ans;w[tmp]^=ans;
			if(tmp==B){
				for(int i=1;i<=tmp;i++){
					null[cnt+i].x[0]=x[i][0];
					null[cnt+i].x[1]=x[i][1];
					null[cnt+i].w=w[i];
				}
				build(1,cnt+=tmp,0,root);
				tmp=0;
			}
		}
		else{
			scanf("%d%d%d%d",&l[0],&l[1],&r[0],&r[1]);
			l[0]^=ans;l[1]^=ans;r[0]^=ans;r[1]^=ans;
			ans=0;
			for(int i=1;i<=tmp;i++)if(l[0]<=x[i][0]&&l[1]<=x[i][1]&&x[i][0]<=r[0]&&x[i][1]<=r[1])ans+=w[i];
			query(root);
			printf("%d\n",ans);
		}
	}
	return 0;
}
void build(int l,int r,int k,node *&rt){
	if(l>r){
		rt=null;
		return;
	}
	int mid=(l+r)>>1;
	d=k;
	nth_element(null+l,null+mid,null+r+1);
	rt=null+mid;
	build(l,mid-1,k^1,rt->ch[0]);
	build(mid+1,r,k^1,rt->ch[1]);
	rt->refresh();
}
void query(node *rt){
	if(l[0]<=rt->l[0]&&l[1]<=rt->l[1]&&rt->r[0]<=r[0]&&rt->r[1]<=r[1]){
		ans+=rt->sum;
		return;
	}
	else if(l[0]>rt->r[0]||l[1]>rt->r[1]||r[0]<rt->l[0]||r[1]<rt->l[1])return;
	if(l[0]<=rt->x[0]&&l[1]<=rt->x[1]&&rt->x[0]<=r[0]&&rt->x[1]<=r[1])ans+=rt->w;
	query(rt->ch[0]);
	query(rt->ch[1]);
}