# include<iostream>
# include<bits/stdc++.h>
using namespace std;
# define int long long
# define endl "\n"
#define ls(u) tr[u].l
#define rs(u) tr[u].r
#define sum(u) tr[u].sum
#define cnt(u) tr[u].cnt
const int N = 2e5 + 10;
const int M = 1e6 + 10, inf = 1e10;
int n, tot;
int a[N];
struct node {
int sum = 0;
int cnt = 0;
int l = 0, r = 0;
} tr[N * 30];
struct q {
int sum, cnt;
};
void pushup(int u) {
sum(u) = sum(ls(u)) + sum(rs(u));
cnt(u) = cnt(ls(u)) + cnt(rs(u));
}
void pushdown(int u) {
if (!ls(u)) ls(u) = ++tot;
if (!rs(u)) rs(u) = ++tot;
}
q que(int u, int l, int r, int L, int R) {
if (L <= l && r <= R) {
return {sum(u), cnt(u)};
}
if (l > R || r < L) return {0, 0};
pushdown(u);
int mid = (l + r - 1) / 2;
q a = que(ls(u), l, mid, L, R);
q b = que(rs(u), mid + 1, r, L, R);
return {a.sum + b.sum, a.cnt + b.cnt};
}
void modify(int u, int l, int r, int pos, int k) {
if (l == r) {
cnt(u) += k;
sum(u) = pos* cnt(u);
return;
}
int mid = (l + r - 1) / 2;
pushdown(u);
if (pos <= mid) modify(ls(u), l, mid, pos, k);
else modify(rs(u), mid + 1, r, pos, k);
pushup(u);
}
bool check(double mid, double res) {
q ans = que(0,0,inf,0,mid);
double re = 1.0*ans.cnt*mid-ans.sum;
return re>=res;
}
void solve() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
modify(0, 0, inf, a[i], 1);
}
while (m--) {
int op;
cin >> op;
if (op == 1) {
int p, x;
cin >> p >> x;
modify(0, 0, inf, a[p], -1);
a[p] = x;
modify(0, 0, inf, a[p], 1);
} else {
int v;
cin >> v;
double l = 0, r = 1e15;
double ans;
while (r - l > 1e-5) {
double mid = (l + r) / 2;
if (check(mid, v)) {
r = mid;
ans = mid;
} else l = mid;
}
printf("%.5lf\n", ans);
}
}
}
int tt;
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
tt = 1;
// cin >> tt;
while (tt--)solve();
return 0;
}
有无佬帮忙看看这怎么改,头想秃了