#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int n, q, h[N], t[N], p[N], x[N], y[N + N];
long long v[N];
struct BITree {
  static const int N = ::N * 2;
  long long u[N];
  void modify(int x, long long v) {
    for (; x < N; x += x & -x) u[x] += v;
  }
  long long getsum(int x) {
    long long s = 0;
    for (; x; x -= x & -x) s += u[x];
    return s;
  }
} a, b;
int main() {
  scanf("%d%d", &n, &q);
  map<int, int> mp;
  mp[0] = 0;
  for (int i = 0; i < n; ++i) {
    scanf("%d", h + i);
    mp[h[i]] = 0;
  }
  for (int i = 0; i < q; ++i) {
    scanf("%d", t + i);
    if (t[i] == 2)
      scanf("%I64d", v + i);
    else {
      scanf("%d%d", p + i, x + i);
      --p[i], mp[x[i]] = 0;
    }
  }
  map<int, int>::iterator it = mp.begin();
  for (int i = 1; it != mp.end(); ++it, ++i) {
    y[i] = it->first;
    it->second = i;
  }
  for (int i = 0; i < n; ++i) {
    h[i] = mp[h[i]];
    a.modify(h[i], 1);
    b.modify(h[i], y[h[i]]);
  }
  for (int i = 0; i < q; ++i) {
    if (t[i] == 1) {
      a.modify(h[p[i]], -1);
      b.modify(h[p[i]], -y[h[p[i]]]);
      h[p[i]] = x[i] = mp[x[i]];
      a.modify(h[p[i]], 1);
      b.modify(h[p[i]], y[h[p[i]]]);
    } else {
      int l = 1, r = mp.size() + 1;
      while (l + 1 < r) {
        int m = (l + r) / 2;
        long long w = a.getsum(m) * y[m] - b.getsum(m);
        w <= v[i] ? l = m : r = m;
      }
      long long c = a.getsum(l);
      long long u = c * y[l] - b.getsum(l);
      double ans = y[l] + 1.0 * (v[i] - u) / c;
      printf("%f\n", ans);
    }
  }
}
