Loading

Fhq-Treap 模板

namespace Fhq_Treap {

int ch[N][3], siz[N], val[N], cnt, rnd[N];

inline void update(int x);
inline int newnode(int x);
inline int Kth(int now, int k);
inline void split(int now, int k, int &x, int &y);
inline int merge(int A, int B);

inline void insert(int a);
inline void Delete(int a);
inline int find_rank(int a);
inline int find_Kth(int a);
inline int find_pre(int a);
inline int find_nxt(int a);
}


namespace Fhq_Treap {

inline void update(int x) { siz[x] = 1 + siz[ch[x][0]] + siz[ch[x][1]]; }
inline int newnode(int x) {
  val[++cnt] = x; siz[cnt] = 1;
  rnd[cnt] = rand();
  return cnt;
}
inline int Kth(int now, int k) {
  while (1) {
    if (k <= siz[ch[now][0]])now = ch[now][0];
    else if (k == siz[ch[now][0]] + 1)return now;
    else k -= siz[ch[now][0]] + 1, now = ch[now][1];
  }
}
inline void split(int now, int k, int &x, int &y) {
  if (now == 0) {
    x = y = 0;
    return ;
  }
  if (val[now] <= k) {
    x = now; split(ch[now][1], k, ch[now][1], y);
  } else {
    y = now; split(ch[now][0], k, x, ch[now][0]);
  }
  update(now);
}
inline int merge(int A, int B) {
  if (!A || !B)return A + B;
  else if (rnd[A] < rnd[B]) {
    ch[A][1] = merge(ch[A][1], B);
    update(A); return A;
  } else {
    ch[B][0] = merge(A, ch[B][0]);
    update(B); return B;
  }
}

inline void insert(int a) {
  split(root, a, x, y);
  root = merge(merge(x, newnode(a)), y);
}
inline void Delete(int a) {
  split(root, a, x, z);
  split(x, a - 1, x, y);
  y = merge(ch[y][0], ch[y][1]);
  root = merge(merge(x, y), z);
}
inline int find_rank(int a) {
  split(root, a - 1, x, y);
  int ret = siz[x] + 1;
  root = merge(x, y);
  return ret;
}
inline int find_Kth(int a) { return val[Kth(root, a)]; }
inline int find_pre(int a) {
  split(root, a - 1, x, y);
  int ret = val[Kth(x, siz[x])];
  root = merge(x, y);
  return ret;
}
inline int find_nxt(int a) {
  split(root, a, x, y);
  int ret = val[Kth(y, 1)];
  root = merge(x, y);
  return ret;
}
}
posted @ 2022-08-02 00:32  Aonynation  阅读(28)  评论(0编辑  收藏  举报