普通平衡树76pts求调

P6136 【模板】普通平衡树(数据加强版)

HHYQ_07 @ 2023-10-05 23:31:24

空间爆了,这种情况还有救吗?

#include<bits/stdc++.h>
using namespace std;
#define reg register
const int N=8e6+5;
int tot;
struct node
{
    int ls,rs,delta;
}t[N];
inline void add(int &p,int l,int r,int x,int k)
{
    if(!p)p=++tot;
    if(l==r)
    {
        t[p].delta+=k;
        return;
    }
    int mid=(l+r)>>1;
    if(x<=mid)add(t[p].ls,l,mid,x,k);
    else add(t[p].rs,mid+1,r,x,k);
    t[p].delta=t[t[p].ls].delta+t[t[p].rs].delta;
    return;
}
inline int query_pos(int p,int l,int r,int L,int R)
{
    if(L<=l&&r<=R)return t[p].delta;
    int mid=(l+r)>>1,ans=0;
    if(L<=mid)ans+=query_pos(t[p].ls,l,mid,L,R);
    if(mid<R)ans+=query_pos(t[p].rs,mid+1,r,L,R);
    return ans;
}
inline int query_kth(int p,int l,int r,int k)
{
    if(l==r)return l;
    int mid=(l+r)>>1;
    if(k<=t[t[p].ls].delta)return query_kth(t[p].ls,l,mid,k);
    else return query_kth(t[p].rs,mid+1,r,k-t[t[p].ls].delta);
}
int main()
{
    reg int n,m,opt,x,inf=(1<<30),root=0,lastans=0,ans=0;
    cin>>n>>m;
    while(n--)
    {
        cin>>x;
        add(root,0,inf,x,1);
    }
    while(m--)
    {
        cin>>opt>>x;
        x^=lastans;
        if(opt==1)add(root,0,inf,x,1);
        else if(opt==2)add(root,0,inf,x,-1);
        else if(opt==3)lastans=query_pos(1,0,inf,0,x-1)+1;
        else if(opt==4)lastans=query_kth(1,0,inf,x);
        else if(opt==5)lastans=query_kth(1,0,inf,query_pos(1,0,inf,0,x-1));
        else lastans=query_kth(1,0,inf,query_pos(1,0,inf,0,x)+1);
        if(opt>=3)ans^=lastans;
    } 
    cout<<ans;
    return 0;
}

|