ethan0328 @ 2023-12-22 07:45:28
KDT 求调,后 4 个点 RE,应该是因为 WA 导致 RE。
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
struct node
{
int val,sum,ls,rs,ar[2],lb[2],rb[2];
};
int n,a[N],ind,cnt,rt[30];
node t[N];
bool cmp1(int x,int y)
{
return t[x].ar[0]<t[y].ar[0];
}
bool cmp2(int x,int y)
{
return t[x].ar[1]<t[y].ar[1];
}
void push_up(int p)
{
t[p].sum=t[t[p].ls].sum+t[t[p].rs].sum+t[p].val;
for(int i=0;i<2;i++)
{
t[p].lb[i]=t[p].rb[i]=t[p].ar[i];
if(t[p].ls)
{
t[p].lb[i]=min(t[p].lb[i],t[t[p].ls].lb[i]);
t[p].rb[i]=max(t[p].rb[i],t[t[p].ls].rb[i]);
}
if(t[p].rs)
{
t[p].lb[i]=min(t[p].lb[i],t[t[p].rs].lb[i]);
t[p].rb[i]=max(t[p].rb[i],t[t[p].rs].rb[i]);
}
}
}
int build(int l,int r,int k)
{
if(r<l)
{
return 0;
}
int mid=(l+r)>>1;
nth_element(a+1,a+mid,a+r+1,k? cmp2:cmp1);
t[a[mid]].ls=build(l,mid-1,k^1);
t[a[mid]].rs=build(mid+1,r,k^1);
push_up(a[mid]);
return a[mid];
}
void clr(int &p)
{
if(!p)
{
return;
}
a[++cnt]=p;
clr(t[p].ls);
clr(t[p].rs);
p=0;
}
int query(int p,int x[2],int y[2])
{
if(!p)
{
return 0;
}
bool flg=1;
for(int i=0;i<2;i++)
{
flg&=(x[i]<=t[p].lb[i]&&t[p].rb[i]<=y[i]);
}
if(flg)
{
return t[p].sum;
}
for(int i=0;i<2;i++)
{
if(t[p].rb[i]<x[i]||t[p].lb[i]>y[i])
{
return 0;
}
}
flg=1;
for(int i=0;i<2;i++)
{
flg&=(x[i]<=t[p].ar[i]&&t[p].ar[i]<=y[i]);
}
int ret=0;
if(flg)
{
ret+=t[p].val;
}
ret+=query(t[p].ls,x,y)+query(t[p].rs,x,y);
return ret;
}
signed main()
{
int lst=0,op,x,y,z,ll[2],rr[2];
cin>>n;
while(cin>>op)
{
if(op==3)
{
break;
}
if(op==1)
{
ind++;
cin>>t[ind].ar[0]>>t[ind].ar[1]>>t[ind].val;
t[ind].ar[0]^=lst;
t[ind].ar[1]^=lst;
t[ind].val^=lst;
cnt=0;
a[++cnt]=ind;
for(int i=0;i<=20;i++)
{
if(!rt[i])
{
rt[i]=build(1,cnt,0);
break;
}else
{
clr(rt[i]);
}
}
}else
{
cin>>ll[0]>>ll[1]>>rr[0]>>rr[1];
ll[0]^=lst;ll[1]^=lst;
rr[0]^=lst;rr[1]^=lst;
lst=0;
for(int i=0;i<=20;i++)
{
lst+=query(rt[i],ll,rr);
}
cout<<lst<<"\n";
}
}
}