FHQ 求调。
查看原帖
FHQ 求调。
1296826
lcfollower楼主2024/6/29 14:50
#include<bits/stdc++.h>

#define int long long
#define _Dark_Star exit(0)
#define inf 1e18
#define up(i,x,y) for(register int i=x;i<=y;i++)
#define dn(i,x,y) for(register int i=x;i>=y;i--)
using namespace std;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return x*f;}
inline void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10|48);}
inline void writeln(int x){write(x),putchar('\n');}
inline void writesp(int x){write(x),putchar(' ');}

const int N = 1e5 + 10;
int l[N] ,r[N] ,val[N] ,key[N], sz[N];
int idx ,root;


 inline int new_node(int v){return val[++idx] = v ,key[idx] = rand() ,sz[idx] = 1 ,idx;}
  inline void pushup(int u){sz[u] = sz[l[u]] + sz[r[u]] + 1;}
  inline void split(int u ,int v,int &x, int &y){
    if(!u){x = y = 0;return;}
    if(val[u] <= v){
      x = u;
      split(r[u] ,v ,r[u] ,y);
    }
    else{
      y = u;
      split(l[u] ,v, x, l[u]);
    }
    pushup(u);
  }
  inline int merge(int x,int y){
    if(!x || !y) return x + y;
    if(key[x] < key[y]){
      r[x] = merge(r[x] ,y);
      pushup(x);
      return x;
    }
    else{
      l[y] = merge(x ,l[y]);
      pushup(y);
      return y;
    }
  }
  inline void insert(int v){
    int x,y,z;
    split(root, v ,x, y);
    z = new_node(v);
    root = merge(merge(x ,z) ,y);
  }
  inline void del(int v){
    int x,y,z;
    split(root ,v ,x ,z);
    split(root ,v - 1, x ,y);
    y = merge(l[y] ,r[y]);
    root = merge(merge(x ,y) ,z);
  }
  inline int get_val(int u ,int siz){
    if(siz == sz[l[u]] + 1) return u;
    if(siz > sz[l[u]] + 1) return get_val(r[u] ,siz - sz[l[u]] - 1);
    return get_val(l[u] ,siz);
  }
  inline int get_pre(int v){
    int x,y;
    split(root ,v - 1 ,x ,y);
    int p = get_val(x ,sz[x]);
    root = merge(x,y);
    return val[p];
  }
  inline int get_suc(int v){
    int x,y;
    split(root, v ,x, y);
    int p = get_val(y ,1);
    root = merge(x ,y);
    return val[p];
  }
  inline int get_rank(int v){
    int x,y;
    split(root ,v - 1 ,x ,y);
    int p = sz[x] + 1;
    root = merge(x, y);
    return p;
  }
signed main(){
  int T = read();
  while(T--){
    int op = read() ,  x = read();
    if(op == 1) insert(x);
    if(op == 2) del(x);
    if(op == 3) writeln(get_rank(x));
    if(op == 4) writeln(val[get_val(root ,x)]);
    if(op == 5) writeln(get_pre(x));
    if(op == 6) writeln(get_suc(x));
  }
  _Dark_Star;
}
2024/6/29 14:50
加载中...