【违规自删】可持久化平衡树
查看原帖
【违规自删】可持久化平衡树
483966
一粒夸克楼主2021/5/8 21:17

用 Trie 树写的,28分求助 评测记录

#include<bits/stdc++.h>
using namespace std;
int n,inf=1e9;
int root[500005],tr[2][16000005],val[16000005],cnt=1;
bool is;
void insert(int x,int v,int i,int od){
    int now=root[i]=++cnt;
    int old=root[od];val[now]=val[old]+v;
    for(int i=30;i>=0;i--){
        tr[0][now]=tr[0][old];
        tr[1][now]=tr[1][old];
        now=tr[(x>>i)&1][now]=++cnt;
        old=tr[(x>>i)&1][old];
        val[now]=val[old]+v;
        if(val[now]<0)is=1;
    }
}
inline int query(int k,int v){
    int res=0,now=root[v];
    for(int i=30;i>=0;i--){
        res<<=1;
        if(val[tr[0][now]]>=k)now=tr[0][now];
        else{
            res|=1;
            k-=val[tr[0][now]];
            now=tr[1][now];
        }
    }
    if(res>2e9)return 2147483647;
    if(res==0)return -2147483647;
    return res-inf;
}
inline int find(int x,int v){
    int res=1,now=root[v];
    for(int i=30;i>=0&&now;i--){
        if((x>>i)&1){
            res+=val[tr[0][now]];
            now=tr[1][now];
        }else now=tr[0][now];
    }
    return res;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        int v,op,x;
        scanf("%d%d%d",&v,&op,&x);
        if(op==1)insert(x+inf,1,i,v);
        else if(op==2)insert(x+inf,-1,i,v);
        else if(op==3)printf("%d\n",find(x+inf,v));
        else if(op==4)printf("%d\n",query(x,v));
        else if(op==5)printf("%d\n",query(find(x+inf,v)-1,v));
        else if(op==6)printf("%d\n",query(find(x+inf+1,v),v));
        if(op>2)root[i]=root[v];
        if(op==2&&is)is=0,insert(x+inf,1,i,v);
//      printf("%d : ",i);
//      put(root[i],0),putchar('\n');
    }

    return 0;
} 
2021/5/8 21:17
加载中...