报错代码:Runtime Error.Exit code is -1073741819 Program exited with code 5.
#include<bits/stdc++.h>
#define ls u<<1
#define rs u<<1|1
using namespace std;
typedef long long ll;
const int N=100010;
struct Tree{
int l,r;
ll v,t;
}tr[N<<3];
ll v[N<<1],a[N];
void pushup(int u){
tr[u].v=tr[ls].v+tr[rs].v;
tr[u].t=tr[ls].t+tr[rs].t;
}
void build(int u,int l,int r){
tr[u].l=l,tr[u].r=r,tr[u].t=tr[u].v=0;
if(l==r)return;
int M=l+r>>1;
build(ls,l,M),build(rs,M+1,r);
pushup(u);
}
void modify(int u,int x,int k){
if(tr[u].l==x&&tr[u].r==x){
tr[u].v+=(ll)v[x]*k;
tr[u].t+=k;
return;
}
int mid=tr[u].l+tr[u].r>>1;
if(x>mid)modify(rs,x,k);
else modify(ls,x,k);
pushup(u);
}
typedef pair<ll,ll> PII;
#define PX first
#define PY second
ll query(int u,int l,int r,int &cnt){
if(tr[u].l>=l&&tr[u].r<=r){
cnt+=tr[u].t;
return tr[u].v;
}
int mid=tr[u].l+tr[u].r>>1;
if(l>mid)return query(rs,l,r,cnt);
if(r<=mid)return query(ls,l,r,cnt);
ll lr=query(ls,l,r,cnt);
ll rr=query(rs,l,r,cnt);
return lr+rr;
}
struct Query{
int op;ll x,v;
}Q[N];
int n,q;
int m;
//对所有出现的水银体积做离散化建立SGT,维护离散化数组v的区间和(实际上需要前缀和)
//首先原a数组是要统计一次
//对每个op (1,p,x)需要实时修改a数组,先把修改前的a[p]在SGT对应位置减少一个(-v[find(a[p]]))
//在新的值对应位置加一次
//对op(2,v),二分
int main(){
cin>>n>>q;
//build(1,1,n);
for(int i=1;i<=n;i++){cin>>a[i];v[i]=a[i];}
m=n;
for(int i=1;i<=q;i++){
cin>>Q[i].op;
if(Q[i].op==1){
cin>>Q[i].x>>Q[i].v;
v[++m]=Q[i].v;
}
else{
Q[i].x=0;
cin>>Q[i].v;
}
}
sort(v+1,v+1+m);
int LEN=unique(v+1,v+1+m)-v-1;
m=LEN;
build(1,1,m);
for(int i=1;i<=n;i++){
int loc=lower_bound(v+1,v+1+m,a[i])-v;
modify(1,loc,1);
}
for(int i=1;i<=q;i++){
int op=Q[i].op;ll val=Q[i].v,x=Q[i].x;
if(op==1){
int loc1=lower_bound(v+1,v+1+m,a[x])-v;
int loc2=lower_bound(v+1,v+1+m,val)-v;
modify(1,loc1,-1);
a[x]=val;
modify(1,loc2,1);
}
else{
double L=0,R=1e15,mid;
while(R-L>1e-5){
mid=(L+R)/2;
int loc=lower_bound(v+1,v+1+m,ceil(mid))-v;
int cnt=0;
ll S=query(1,1,loc-1,cnt);
if(S+val>cnt*mid) L=mid;
else R=mid;
}
printf("%.5lf\n",mid);
}
}
}