hexz01 @ 2024-06-12 20:32:45
#include <iostream>
#include <algorithm>
using namespace std;
const int N=2e5+7;
const double W=0.75;
int n, tot=0, root=0;
struct node{
int x[2], val;
node(){}
node(int xx, int y, int vall){
x[0]=xx, x[1]=y, val=vall;
}
};
struct tnode{
node x;
int sum, sz, maxn[2], minn[2];
int lc, rc;
};
tnode tree[N];
node tool[N];int retot=0;
int id[N], idtot=0;
int newnode(){
return (idtot?id[idtot--]:++tot);
}
bool cmp0(node x, node y){
return x.x[0]<y.x[0];
}
bool cmp1(node x, node y){
return x.x[1]<y.x[1];
}
void pushup(int x){
tree[x].maxn[0]=tree[x].minn[0]=tree[x].x.x[0];
tree[x].maxn[1]=tree[x].minn[1]=tree[x].x.x[1];
if(tree[x].lc){
tree[x].maxn[0]=max(tree[x].maxn[0], tree[tree[x].lc].maxn[0]);
tree[x].minn[0]=min(tree[x].minn[0], tree[tree[x].lc].minn[0]);
tree[x].maxn[1]=max(tree[x].maxn[1], tree[tree[x].lc].maxn[1]);
tree[x].minn[1]=min(tree[x].minn[1], tree[tree[x].lc].minn[1]);
}
if(tree[x].rc){
tree[x].maxn[0]=max(tree[x].maxn[0], tree[tree[x].rc].maxn[0]);
tree[x].minn[0]=min(tree[x].minn[0], tree[tree[x].rc].minn[0]);
tree[x].maxn[1]=max(tree[x].maxn[1], tree[tree[x].rc].maxn[1]);
tree[x].minn[1]=min(tree[x].minn[1], tree[tree[x].rc].minn[1]);
}
tree[x].sum=tree[tree[x].lc].sum+tree[tree[x].rc].sum+tree[x].x.val;
tree[x].sz=tree[tree[x].lc].sz+tree[tree[x].rc].sz+1;
}
void addall(int x){
if(x){
id[++idtot]=x;
tool[++retot]=tree[x].x;
addall(tree[x].lc);
addall(tree[x].rc);
}
}
void build(int &x, int l, int r, int d){
if(l<=r){
int mid=(l+r)>>1;
x=newnode();
nth_element(tool+l, tool+mid, tool+r+1, d?cmp1:cmp0);
tree[x].x=tool[mid];
build(tree[x].lc, l, mid-1, !d);
build(tree[x].rc, mid+1, r, !d);
pushup(x);
}else{
x=0;
}
}
void check(int &x){
if(tree[tree[x].lc].sz<W*tree[tree[x].rc].sz || tree[tree[x].rc].sz<W*tree[tree[x].lc].sz){
retot=idtot=0;
addall(x);
build(x, 1, retot, 0);
}
}
void insert(int &x, node now, int d){
if(!x){
x=newnode();
tree[x].x=now;
pushup(x);
}else{
if(now.x[d]<=tree[x].x.x[d])
insert(tree[x].lc, now, d);
else
insert(tree[x].rc, now, d);
pushup(x);
check(x);
}
}
bool in(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4){
return (x1<=x3 && y1<=y3 && x2>=x4 && y2>=y4);
}
bool out(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4){
return (x1>x4 || x2<x3 || y1>y4 || y2<y3);
}
int query(int x, int x1, int y1, int x2, int y2){
if(!x)
return 0;
if(in(x1, y1, x2, y2, tree[x].minn[0], tree[x].minn[1], tree[x].maxn[0], tree[x].maxn[1])){
return tree[x].sum;
}
if(out(x1, y1, x2, y2, tree[x].minn[0], tree[x].minn[1], tree[x].maxn[0], tree[x].maxn[1]))
return 0;
int ans=0;
if(in(x1, y1, x2, y2, tree[x].x.x[0], tree[x].x.x[1], tree[x].x.x[0], tree[x].x.x[1]))
ans+=tree[x].x.val;
ans+=query(tree[x].lc, x1, y1, x2, y2);
ans+=query(tree[x].rc, x1, y1, x2, y2);
return ans;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
int lstans=0;
while(1){
int c;
cin>>c;
if(c==1){
int x, y, A;
cin>>x>>y>>A;
x^=lstans;y^=lstans;A^=lstans;
insert(root, node(x, y, A), 0);
}else if(c==2){
int x1, y1, x2, y2;
cin>>x1>>y1>>x2>>y2;
x1^=lstans;x2^=lstans;y1^=lstans;y2^=lstans;
lstans=query(root, x1, y1, x2, y2);
cout<<lstans<<endl;
}else
return 0;
}
return 0;
}
后两个点TLE。