#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int max(int a, int b){ return a > b ? a : b; }
inline int min(int a, int b){ return a < b ? a : b; }
inline double max(double a, double b){ return a > b ? a : b; }
inline double min(double a, double b){ return a < b ? a : b; }
const int maxn = 1e5 + 10;
struct node
{
node(int l, int r){ this->l = l, this->r = r; }
int l, r, mx, cnt=0,val=0;
node* lson=NULL, *rson=NULL;
};
node root(0,1e15);
int arr[maxn];
inline void push_up(node* now)
{
if (now->lson && (now->lson->cnt == 0))
{
delete now->lson;
now->lson = NULL;
}
if (now->rson && (now->rson->cnt == 0))
{
delete now->rson;
now->rson = NULL;
}
if (now->lson&&now->rson)
{
now->mx = now->rson->mx;
now->cnt = now->lson->cnt + now->rson->cnt;
now->val = now->rson->val + now->lson->val + (now->rson->mx - now->lson->mx)*(now->lson->cnt);
}
else if (now->lson)
{
now->mx = now->lson->mx;
now->cnt = now->lson->cnt;
now->val = now->lson->val;
}
else if (now->rson)
{
now->mx = now->rson->mx;
now->cnt = now->rson->cnt;
now->val = now->rson->val;
}
else
{
now->cnt = 0;
now->val = 0;
}
}
void update(node* now, int v, int x)
{
int l = now->l, r = now->r;
if (l == r)
{
now->mx = v;
now->cnt+=x;
return;
}
int mid = l + r >> 1;
if (v <= mid)
{
if (!(now->lson))
{
now->lson = new node(l, mid);
}
update(now->lson, v,x);
}
else
{
if (!(now->rson))
{
now->rson = new node(mid + 1, r);
}
update(now->rson, v,x);
}
push_up(now);
}
node ask(node* now, int v)
{
int l = now->l, r = now->r;
if ((l==r) || (now->cnt <= v))
{
node ret = *now;
return ret;
}
if (now->lson&&now->lson->cnt < v)
{
node ret(0, 0);
if (now->rson)
{
node tb = ask(now->rson, v - now->cnt);
ret.lson = now->lson;
ret.rson = &tb;
push_up(&ret);
}
return ret;
}
else if (now->lson)
{
return ask(now->lson, v);
}
else
return ask(now->rson, v);
}
signed main()
{
/*ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);*/
int n, m; cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> arr[i];
update(&root, arr[i],1);
}
for (int i = 1; i <= m; i++)
{
int op; cin >> op;
if (op == 1)
{
int p, x; cin >> p >> x;
update(&root, arr[p], -1);
arr[p] = x;
update(&root, arr[p], 1);
}
else
{
int v; cin >> v;
int l = 1, r = n;
node ans(0,0);
int ansl;
while (l <= r)
{
int mid = l + r >> 1;
node tmp = ask(&root, mid);
if (tmp.val < v)
{
ans = tmp;
ansl = mid;
l = mid + 1;
}
else
{
r = mid - 1;
}
}
double an = (double)(v - ans.val) / (double)(ans.cnt) + ans.mx;
printf("%.5lf\n", an);
}
}
return 0;
}
麻木了,为什么啊