题意:https://www.luogu.com.cn/problem/CF1354D
思路:首先我们要注意到每次加入的和原先在数组中的数都是处于1到n之间的,所以我们考虑树状数组标记每个值的状态,那么我们应该如何删掉第k个呢,我们每次删除操作的时候二分查找第k个数的下标即可。
/*keep on going and never give up*/
#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
#define int long long
typedef pair<int, int> pii;
#define lowbit(x) x&(-x)
#define endl '\n'
#define wk is zqx ta die
int n, q;
int a[1000005];
int k[1000005];
int f[1000005];
void add(int x, int y) {
while (x <= n) {
f[x] += y;
x += lowbit(x);
}
}
int query(int x) {
int res = 0;
while (x) {
res += f[x];
x -= lowbit(x);
}
return res;
}
int pos(int x) {
int l = 1;
int r = n;
int ans;
while (l <= r) {
int mid = (l + r) >> 1;
if (query(mid) >= x) {
ans = mid;
r = mid - 1;
} else {
l = mid + 1;
}
}
return ans;
}
signed main() {
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> q;
for (int i = 1; i <= n; i++) {
cin >> a[i];
add(a[i], 1);
}
for (int i = 1; i <= q; i++) {
int k;
cin >> k;
if (k > 0) {
add(k, 1);
} else {
add(pos(-k), -1);
}
}
if (query(n) == 0) {
cout << "0" << endl;
} else {
cout << pos(1) << endl;
}
return 0;
}