https://codeforces.com/problemset/problem/1354/D
这题直接用树状数组的找第k小数的一个log复杂度的方法做
然而之前t了一发。。。然后加读入优化后发现我之前自己的板子不能读负数。。。。尝试自己写后过了样例但是wa了。。。
后来网上抄了一个读入优化过了。。。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define reads(n) FastIO::read(n)
namespace FastIO {
const int SIZE = 1 << 16;
char buf[SIZE], obuf[SIZE], str[60];
int bi = SIZE, bn = SIZE, opt;
int read(char *s) {
while (bn) {
for (; bi < bn && buf[bi] <= ' '; bi++);
if (bi < bn) break;
bn = fread(buf, 1, SIZE, stdin);
bi = 0;
}
int sn = 0;
while (bn) {
for (; bi < bn && buf[bi] > ' '; bi++) s[sn++] = buf[bi];
if (bi < bn) break;
bn = fread(buf, 1, SIZE, stdin);
bi = 0;
}
s[sn] = 0;
return sn;
}
bool rd(int& x) {
int n = read(str), bf;
if (!n) return 0;
int i = 0; if (str[i] == '-') bf = -1, i++; else bf = 1;
for (x = 0; i < n; i++) x = x * 10 + str[i] - '0';
if (bf < 0) x = -x;
return 1;
}
};
using namespace FastIO;
const int maxl=1e6+10;
int n,m,ans,cas,k,q;
int a[maxl],b[maxl];
inline int sum(int i)
{
int ret=0;
while(i)
{
ret+=b[i];
i-=i&-i;
}
return ret;
}
inline void add(int i,int x)
{
if(i==0) return;
while(i<=n)
{
b[i]+=x;
i+=i&-i;
}
}
inline void prework()
{
//scanf("%d%d",&n,&q);
rd(n);rd(q);
for(register int i=1;i<=n;++i)
{
//scanf("%d",&a[i]);
rd(a[i]);
add(a[i],1);
}
}
inline int find_kth(int k)
{
int ans=0,cnt=0;
for (register int i=21;i>=0;--i)
{
ans+=(1<<i);
if (ans>=n || cnt+b[ans]>=k)
ans-=(1<<i);
else
cnt+=b[ans];
}
return ans+1;
}
inline void mainwork()
{
int num=n,d;
for(register int i=1;i<=q;++i)
{
//scanf("%d",&k);
rd(k);
if(k>0)
{
num++;
add(k,1);
}
else
{
num--;
d=find_kth(-k);
add(d,-1);
}
}
if(num==0)
ans=0;
else
ans=find_kth(1);
}
inline void print()
{
printf("%d",ans);
}
int main()
{
int t=1;
//scanf("%d",&t);
for(cas=1;cas<=t;cas++)
{
prework();
mainwork();
print();
}
return 0;
}