题目:https://vjudge.net/contest/238532#problem/E
一看好像是区间第k大,然而并不是,只是一个单点更新的区间问题。
单点更新用树状数组多好…..久违的写树状数组。
维护区间用树状数组,找第k大用二分。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxe = 100005;
int tree[maxe];
int lowbit(int x) {
return x & (-x);
}
void update(int pos, int val) {
while(pos < maxe) {
tree[pos] += val;
pos += lowbit(pos);
}
}
int query(int pos) {
int sum = 0;
while(pos >= 1) {
sum += tree[pos];
pos -= lowbit(pos);
}
return sum;
}
int find(int l, int r, int a, int k) {
int sum = query(a);
int ans = maxe;
printf("sum = %d\n",sum);
while(l <= r) {
int mid = (l + r) / 2;
int ms = query(mid);
if(ms - sum >= k) {
r = mid - 1;
ans = min(ans, mid);
continue;
}
l = mid + 1;
}
return ans;
}
int main() {
int m, op, e;
while(~scanf("%d", &m)) {
memset(tree, 0, sizeof(tree));
while(m--) {
scanf("%d", &op);
if(op == 0) {
scanf("%d", &e);
update(e, 1);
} else if(op == 1) {
scanf("%d", &e);
int sum = query(e) - query(e - 1);
if(sum == 0) {
printf("No Elment!\n");
} else {
update(e, -1);
}
} else {
int a, k;
scanf("%d%d", &a, &k);
int num = find(a + 1, maxe - 1, a, k);
if(num == maxe) {
printf("Not Find!\n");
} else {
printf("%d\n", num);
}
}
}
}
return 0;
}