强制在线还卡内存,于是上KDT,插入的时候替罪羊式重建,真是tm玄学复杂度
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
using namespace std;
#define MAXN 200010
#define MAXM 1010
#define ll long long
#define INF 1000000000
#define MOD 1000000007
#define eps 1e-8
#define alpha 0.6
char xB[1<<15],*xS=xB,*xT=xB;
#define getc() (xS==xT&&(xT=(xS=xB)+fread(xB,1,1<<15,stdin),xS==xT)?0:*xS++)
inline int read(){
char ch=getc();
int f=1,x=0;
while(!(ch>='0'&&ch<='9')){if(ch=='-')f=-1;ch=getc();}
while(ch>='0'&&ch<='9'){x=x*10+(ch-'0');ch=getc();}
return x*f;
}
struct pt{
int x;
int y;
int v;
pt(){
}
pt(int _x,int _y,int _v){
x=_x;
y=_y;
v=_v;
}
};
pt v[MAXN],L[MAXN],R[MAXN];
int siz[MAXN];
int sum[MAXN];
int son[MAXN][2];
int q[MAXN],hd,tl;
int rt;
int tot;
pt p[MAXN];
int len;
int la;
int nn(){
int re;
if(hd!=tl){
re=q[hd++];
hd%=MAXN;
}else{
re=++tot;
}
return re;
}
void del(int x){
siz[x]=sum[x]=son[x][0]=son[x][1]=0;
q[tl++]=x;
tl%=MAXN;
}
bool cmpx(pt x,pt y){
return x.x<y.x;
}
bool cmpy(pt x,pt y){
return x.y<y.y;
}
bool (*cmp[])(pt x,pt y)={cmpx,cmpy};
inline void ud(int x){
L[x]=R[x]=v[x];
sum[x]=v[x].v+sum[son[x][0]]+sum[son[x][1]];
siz[x]=1+siz[son[x][0]]+siz[son[x][1]];
if(son[x][0]){
L[x].x=min(L[x].x,L[son[x][0]].x);
L[x].y=min(L[x].y,L[son[x][0]].y);
R[x].x=max(R[x].x,R[son[x][0]].x);
R[x].y=max(R[x].y,R[son[x][0]].y);
}
if(son[x][1]){
L[x].x=min(L[x].x,L[son[x][1]].x);
L[x].y=min(L[x].y,L[son[x][1]].y);
R[x].x=max(R[x].x,R[son[x][1]].x);
R[x].y=max(R[x].y,R[son[x][1]].y);
}
}
inline bool bad(int x){
if(siz[son[x][0]]>alpha*siz[x]+3||siz[son[x][1]]>alpha*siz[x]+3){
return 1;
}
return 0;
}
void build(int &x,int y,int z,int f){
if(y>z){
return ;
}
x=nn();
int mid=y+z>>1;
nth_element(p+y,p+mid,p+z+1,cmp[f]);
v[x]=p[mid];
build(son[x][0],y,mid-1,f^1);
build(son[x][1],mid+1,z,f^1);
ud(x);
}
void todel(int x){
if(!x){
return ;
}
p[++len]=v[x];
todel(son[x][0]);
todel(son[x][1]);
del(x);
}
void rebuild(int &x,int f){
len=0;
todel(x);
build(x,1,len,f);
}
void insert(int &x,pt p,int f){
if(!x){
x=nn();
v[x]=p;
ud(x);
return ;
}
sum[x]+=p.v;
siz[x]++;
if(v[x].x==p.x&&v[x].y==p.y){
v[x].v+=p.v;
return ;
}
if(cmp[f](p,v[x])){
insert(son[x][0],p,f^1);
}else{
insert(son[x][1],p,f^1);
}
if(bad(x)){
rebuild(x,f);
}
ud(x);
}
int ask(int x,int lx,int ly,int rx,int ry){
if(!x){
return 0;
}
if(L[x].x>rx||L[x].y>ry||R[x].x<lx||R[x].y<ly){
return 0;
}
if(L[x].x>=lx&&L[x].y>=ly&&R[x].x<=rx&&R[x].y<=ry){
return sum[x];
}
int re=0;
if(v[x].x>=lx&&v[x].y>=ly&&v[x].x<=rx&&v[x].y<=ry){
re+=v[x].v;
}
return re+ask(son[x][0],lx,ly,rx,ry)+ask(son[x][1],lx,ly,rx,ry);
}
int main(){
int o,x,y,xx,yy;
read();
while(1){
o=read();
if(o==3){
break;
}
if(o==1){
x=read();
y=read();
xx=read();
x^=la;
y^=la;
xx^=la;
insert(rt,pt(x,y,xx),0);
}
if(o==2){
x=read();
y=read();
xx=read();
yy=read();
x^=la;
y^=la;
xx^=la;
yy^=la;
printf("%d\n",la=ask(rt,x,y,xx,yy));
}
}
return 0;
}
/*
*/