RT,为什么平衡树能超时?
#include <bits/stdc++.h>
using namespace std;
int dl, dr, tmp, cnt, root, nn;
struct Tjaweiof{
int l, r, key, priority, sz, num;
}tree[200001];
void getrand(int x, int a){
cnt++;
tree[cnt].key = x;
tree[cnt].priority = rand();
tree[cnt].num = a;
tree[cnt].sz = a;
nn += a;
return;
}
void pushup(int x){
tree[x].sz = tree[tree[x].l].sz + tree[tree[x].r].sz + tree[x].num;
return;
}
void split(int x, int v, int &l, int &r){
if (!x){
l = 0;
r = 0;
return;
}
if (tree[x].key <= v){
l = x;
split(tree[x].r, v, tree[x].r, r);
} else {
r = x;
split(tree[x].l, v, l, tree[x].l);
}
pushup(x);
return;
}
int merge(int l, int r){
if (!l || !r){
return l + r;
}
if (tree[l].priority <= tree[r].priority){
tree[l].r = merge(tree[l].r, r);
pushup(l);
return l;
} else {
tree[r].l = merge(l, tree[r].l);
pushup(r);
return r;
}
}
void insert(int x, int a){
split(root, x - 1, dl, dr);
getrand(x, a);
root = merge(dl, merge(cnt, dr));
return;
}
int getnum(int p, int x){
int u = tree[tree[p].l].sz + 1, v = tree[tree[p].l].sz + tree[p].num;
if (u <= x && x <= v){
return tree[p].key;
} else if (x < u){
return getnum(tree[p].l, x);
} else {
return getnum(tree[p].r, x - v);
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
srand(time(NULL));
int n, v, a;
cin >> n;
while (n--){
cin >> v >> a;
insert(v, a);
cout << getnum(root, (nn + 1) >> 1) << endl;
}
return 0;
}