WA 6-10
主要问题:在查询排名时可能会输出0,且正确答案数值很大
Code:
(flg与fflg均为调试中变量,无实际意义
#include<bits/stdc++.h>
using namespace std;
//Treap
struct node {
int l, r, cnt, size, val, dat;
} a[100010];
int ccnt, root, n;
bool flg, fflg;
int New(int val) {
a[++ccnt].val = val;
a[ccnt].dat = rand();
a[ccnt].cnt = a[ccnt].size = 1;
return ccnt;
}
inline void upd(int p) {
a[p].size = a[a[p].l].size + a[a[p].r].size + a[p].cnt;
}
void build() {
New(-1000000000);
New(1000000000);
a[1].r = 2;
root = 1;
upd(root);
}
int GetRank(int p, int q) {
if (p == 0) return 1;
if (q == a[p].val) {
fflg = false;
return a[a[p].l].size + 1;
}
if (q > a[p].val) {
fflg = false;
return GetRank(a[p].r, q) + a[a[p].l].size + a[p].cnt;
} else {
return GetRank(a[p].l, q);
}
}
int GetVal(int p, int q) {
if (p == 0) return 1000000000;
if (a[a[p].l].size >= q) {
return GetVal(a[p].l, q);
}
if (a[a[p].l].size + a[p].cnt >= q) return a[p].val;
return GetVal(a[p].r, q - a[a[p].l].size - a[p].cnt);
}
void zig(int &p) {
int q = a[p].l;
a[p].l = a[q].r;
a[q].r = p;
p = q;
upd(a[p].r);
upd(p);
}
void zag(int &p) {
int q = a[p].r;
a[p].r = a[q].l;
a[q].l = p;
p = q;
upd(a[p].l);
upd(p);
}
void Insert(int &p, int val) {
if (p == 0) {
p = New(val);
return;
}
if (val == a[p].val) {
a[p].cnt++;
upd(p);
return;
}
if (val < a[p].val) {
Insert(a[p].l, val);
if (a[p].dat < a[a[p].l].dat) zig(p);
}
if (val > a[p].val) {
Insert(a[p].r, val);
if (a[p].dat < a[a[p].r].dat) zag(p);
}
upd(p);
}
int GetPre(int val) {
int ans = 1;
int p = root;
while (p) {
if (val == a[p].val) {
if (a[p].l > 0) {
p = a[p].l;
while (p > 0) {
p = a[p].r;
ans = p;
}
break;
}
}
if (a[p].val > a[ans].val && a[p].val < val) {
ans = p;
}
if (val > a[p].val) {
p = a[p].r;
} else {
p = a[p].l;
}
}
return a[ans].val;
}
int GetNext(int val) {
int ans = 2;
int p = root;
while (p) {
if (val == a[p].val) {
if (a[p].r > 0) {
p = a[p].r;
while (p > 0) {
p = a[p].l;
ans = p;
}
}
break;
}
if (a[p].val < a[ans].val && a[p].val > val) {
ans = p;
}
if (val > a[p].val) {
p = a[p].r;
} else {
p = a[p].l;
}
}
return a[ans].val;
}
void Remove(int &p, int val) {
if (p == 0) return;
if (val == a[p].val) {
if (a[p].cnt > 1) {
a[p].cnt--;
upd(p);
return;
}
if (a[p].l || a[p].r) {
if (a[p].r == 0 || a[a[p].l].dat > a[a[p].r].dat) {
zig(p);
Remove(a[p].r, val);
} else {
zag(p);
Remove(a[p].l, val);
}
upd(p);
} else {
p = 0;
return;
}
}
val < a[p].val ? Remove(a[p].l, val) : Remove(a[p].r, val);
upd(p);
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
build();
cin >> n;
int op, p;
// freopen("test.out", "w", stdout);
for (int i = 1; i <= n; i++) {
cin >> op >> p;
if (op == 1) {
Insert(root, p);
} else if (op == 2) {
Remove(root, p);
} else if (op == 3) {
cout << GetRank(root, p) - 1 << endl;
} else if (op == 4) {
cout << GetVal(root, p + 1) << endl;
} else if (op == 5) {
cout << GetPre(p) << endl;
} else {
cout << GetNext(p) << endl;
}
}
// cout << "[]" << flg;
return 0;
}