标签:tor check none node scan closed opened hide point
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+10; struct point{int x[2],val;}t[N],temp[N]; int mi[N][2],ma[N][2],sum[N],lson[N],rson[N],siz[N]; int st[N],top,ncnt,sort_dim,root; bool operator<(point &a,point &b){return a.x[sort_dim]<b.x[sort_dim];}; int newnode(){return top?st[top--]:++ncnt;} void up(int x) { for(int i=0;i<=1;i++) { mi[x][i]=ma[x][i]=t[x].x[i]; if(lson[x])mi[x][i]=min(mi[x][i],mi[lson[x]][i]),ma[x][i]=max(ma[x][i],ma[lson[x]][i]); if(rson[x])mi[x][i]=min(mi[x][i],mi[rson[x]][i]),ma[x][i]=max(ma[x][i],ma[rson[x]][i]); } sum[x]=sum[lson[x]]+sum[rson[x]]+t[x].val; siz[x]=siz[lson[x]]+siz[rson[x]]+1; } void build(int l,int r,int &pos,int dim) { if(l>r)return (void)(pos=0); int mid=l+r>>1;pos=newnode(); sort_dim=dim; nth_element(temp+l,temp+mid,temp+r+1); t[pos]=temp[mid]; build(l,mid-1,lson[pos],dim^1); build(mid+1,r,rson[pos],dim^1); up(pos); } void pia(int x,int cnt) { if(lson[x])pia(lson[x],cnt); temp[siz[lson[x]]+cnt]=t[x];st[++top]=x; if(rson[x])pia(rson[x],cnt+siz[lson[x]]+1); } void check(int &x,int dim) { if(siz[x]*0.75<siz[lson[x]]||siz[x]*0.75<siz[rson[x]]) pia(x,1),build(1,siz[x],x,dim); } void insert(int &x,point tmp,int dim) { if(!x){x=newnode();lson[x]=rson[x]=0;t[x]=tmp;up(x);return ;} if(tmp.x[dim]<=t[x].x[dim])insert(lson[x],tmp,dim^1); else insert(rson[x],tmp,dim^1); up(x);check(x,dim); } inline int in(int x1,int y1,int x2,int y2,int X1,int Y1,int X2,int Y2) { return x1>=X1&&x2<=X2&&y1>=Y1&&y2<=Y2; } inline int out(int x1,int y1,int x2,int y2,int X1,int Y1,int X2,int Y2) { return X1>x2||X2<x1||Y1>y2||Y2<y1; } int query(int x,int x1,int y1,int x2,int y2) { if(!x)return 0; int ans=0; if(in(mi[x][0],mi[x][1],ma[x][0],ma[x][1],x1,y1,x2,y2))return sum[x]; if(out(mi[x][0],mi[x][1],ma[x][0],ma[x][1],x1,y1,x2,y2))return 0; if(in(t[x].x[0],t[x].x[1],t[x].x[0],t[x].x[1],x1,y1,x2,y2))ans+=t[x].val; ans+=query(lson[x],x1,y1,x2,y2)+query(rson[x],x1,y1,x2,y2); return ans; } int ans=0; int main() { int x1,x2,y1,y2,n,op; scanf("%d",&n); while(1) { scanf("%d",&op); if(op==3)break; else if(op==1) { int x,y,z;scanf("%d%d%d",&x,&y,&z);x^=ans;y^=ans;z^=ans; insert(root,(point){x,y,z},0); } else { scanf("%d%d%d%d",&x1,&y1,&x2,&y2);x1^=ans;x2^=ans;y1^=ans;y2^=ans; ans=query(root,x1,y1,x2,y2); printf("%d\n",ans); } } return 0; }
标签:tor check none node scan closed opened hide point
原文地址:https://www.cnblogs.com/bxd123/p/11755243.html