const int N = 3e5 + 10;
ll value[N];
struct Tree {
ll sum[N << 1], cnt[N << 1];
void update(int rt, int l, int r, int pos, int x) {
if(l == r) {
cnt[rt] += x;
sum[rt] = cnt[rt] * value[l];
return ;
}
if(pos <= mid) update(lson, pos, x);
else update(rson, pos, x);
sum[rt] = sum[ls] + sum[rs];
cnt[rt] = cnt[ls] + cnt[rs];
}
int ask_min(int rt, int l, int r) {//查找最小值
if(l == r) return l;
if(cnt[ls]) return ask_min(lson);
else return ask_min(rson);
}
int ask_max(int rt, int l, int r) {//查找最大值
if(l == r) return l;
if(cnt[rs]) return ask_max(rson);
else return ask_max(lson);
}
ll ask_suc(int rt, int l, int r, int k) {//查找后k大
if(k <= 0) return 0;
if(cnt[rt] <= k) return sum[rt];
if(l == r) return k * value[l];
ll ans = 0;
if(cnt[rs] >= k) {
ans = ask_suc(rson, k);
}
else {
k -= cnt[rs];
ans = sum[rs] + ask_suc(lson, k);
}
return ans;
}
ll ask_pre(int rt, int l, int r, int k) {//查找前k大
if(k <= 0) return 0;
if(cnt[rt] <= k) return sum[rt];
if(l == r) return k * value[l];
ll ans = 0;
if(cnt[ls] >= k) {
ans += ask_pre(lson, k);
}
else {
k -= cnt[ls];
ans = sum[ls] + ask_pre(rson, k);
}
return ans;
}
};