L-中位数_2023河南萌新联赛第(一)场:河南农业大学 (nowcoder.com)
树状数组+二分
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e6;
const long long inf = 0x7f7f7f7f7f7f7f7f;
#define endl '\n'
int f[N];
int n,m;
int lowbit(int x){
return x&(-x);
}
int a[N];
void add(int x,int y){
for(int i=x;i<=1e6;i+=lowbit(i)){
f[i]+=y;
}
}
int sum(int x){
ll res=0;
for(int i=x;i;i-=lowbit(i)){
res+=f[i];
}
return res;
}
int check(int mid){
// cout<<sum(mid)<<" "<<n<<endl;
if(sum(mid)>=(n+1)/2)return 1;
else return 0;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
add(a[i],1);
}
while(m--){
int p,x;
cin>>p>>x;
add(a[p],-1);
a[p]=x;
add(a[p],1);
ll l=0,r=1e6;
while(l<=r){
ll mid=(l+r)/2;
// cout<<mid<<" "<<check(mid)<<endl;
if(check(mid))r=mid-1;
else l=mid+1;
}
cout<<l<<endl;
}
return 0;
}