#include <cstring>
#include <string.h>
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <queue>
#define ll long long
#define PII pair<int, int>
#define PSI pair<string, int>
#define MSI map<string,int>
#define TLE ios::sync_with_stdio(0),cin.tie(0)
#define mod 1000000007
const int INF = 0x7fffffff;
using namespace std;
struct Node {
int rs, ls, siz, val, cnt;
}node[500010];
int Tail = 0;
void Add(int idx,int val ) {
node[idx].siz++;
if (node[idx].val == val) {
node[idx].cnt++; return;
}
if (node[idx].val > val) {
if (node[idx].ls) Add(node[idx].ls, val);
else {
Tail++;
node[Tail].cnt = node[Tail].siz = 1;
node[Tail].val = val;
node[idx].ls = Tail;
}
}
else {
if (node[idx].rs) Add(node[idx].rs, val);
else {
Tail++;
node[Tail].cnt = node[Tail].siz = 1;
node[Tail].val = val;
node[idx].rs = Tail;
}
}
}
int ValToPos(int idx,int val) {
if (!idx) return 0;
if (val == node[idx].val) return node[node[idx].ls].siz + 1;
else if (val > node[idx].val)
return ValToPos(node[idx].rs, val) + node[node[idx].ls].siz + node[idx].cnt;
else if (val < node[idx].val) return ValToPos(node[idx].ls, val);
}
int PosToVal(int idx, int pos) {
if (!idx) return INF;
if (node[node[idx].ls].siz >= pos) return PosToVal(node[idx].ls, pos);
else if (node[node[idx].ls].siz + node[idx].cnt >= pos) return node[idx].val;
else return PosToVal(node[idx].rs, pos - node[node[idx].ls].siz - node[idx].cnt);
}
int FrontMax(int idx, int val, int CurMax) {
if (node[idx].val >= val) {
if (node[idx].ls) return FrontMax(node[idx].ls, val, CurMax);
else return CurMax;
}
else {
if (!node[idx].rs) return node[idx].val;
else if (node[idx].cnt) return FrontMax(node[idx].rs, val, node[idx].val);
else if (!node[idx].cnt) return FrontMax(node[idx].rs, val, CurMax);
}
}
int BehindMin(int idx, int val, int CurMin) {
if (node[idx].val <= val) {
if (node[idx].rs) return BehindMin(node[idx].rs, val, CurMin);
else return CurMin;
}
else {
if (!node[idx].ls) return node[idx].val;
else if (node[idx].cnt) return BehindMin(node[idx].ls, val, node[idx].val);
else if (!node[idx].cnt) return BehindMin(node[idx].ls, val, CurMin);
}
}
int main() {
TLE;
int n, q, e;
cin >> n;
while (n--) {
cin >> q >> e;
if (q == 1) printf("%d\n", ValToPos(1, e) + 1);
else if (q == 2) printf("%d\n", PosToVal(1, e));
else if (q == 3) printf("%d\n", FrontMax(1, e, -INF));
else if (q == 4) printf("%d\n", BehindMin(1, e, INF));
else if (q == 5) {
if (Tail) Add(1, e);
else {
Tail++;
node[Tail].siz = node[Tail].cnt = 1;
node[Tail].val = e;
}
}
}
return 0;
}
数据结构-二叉搜索树BTS(洛谷 P5076 【深基16.例7】普通二叉树(简化版))
最新推荐文章于 2022-11-05 16:43:25 发布