#include <bits/stdc++.h>
#pragma warning(disable : 4996)
using namespace std;
long long n, m;
long long q[200000][3];
long long q2[200000];
long long a[200000];
long long a2[200000];
long long u[300000];
long long now[200000];
long long ui;
map<int, int> ma;
set<pair<long long, long long> > alive;
long long S = 262144;
pair<long long, long long> itree[600000];
void update(long long x) {
  x /= 2;
  while (x > 0) {
    itree[x].first = itree[x * 2].first + itree[x * 2 + 1].first;
    itree[x].second = itree[x * 2].second + itree[x * 2 + 1].second;
    x /= 2;
  }
}
pair<long long, long long> getsum(long long x, long long y) {
  pair<long long, long long> sum = pair<long long, long long>(0, 0);
  while (x <= y) {
    if (x % 2 == 1)
      sum.first += itree[x].first, sum.second += itree[x++].second;
    if (y % 2 == 0)
      sum.first += itree[y].first, sum.second += itree[y--].second;
    x /= 2, y /= 2;
  }
  return sum;
}
int main() {
  long long i, j, k;
  scanf("%I64d%I64d", &n, &m);
  for (i = 0; i < n; i++) scanf("%I64d", &a[i]), u[ui++] = a[i];
  for (i = 0; i < m; i++) {
    scanf("%I64d", &q[i][0]);
    if (q[i][0] == 1) {
      scanf("%I64d%I64d", &q[i][1], &q[i][2]);
      q[i][1]--;
      u[ui++] = q[i][2];
    } else {
      scanf("%I64d", &q[i][1]);
    }
  }
  sort(u, u + ui);
  for (i = ui - 1; i >= 0; i--) {
    ma[u[i]] = i;
  }
  for (i = 0; i < n; i++) {
    a2[i] = ma[a[i]];
    ma[a[i]]++;
  }
  for (i = 0; i < m; i++) {
    if (q[i][0] == 1) q2[i] = ma[q[i][2]], ma[q[i][2]]++;
  }
  for (i = 0; i < n; i++) {
    now[i] = a2[i];
    itree[S + now[i]].first = a[i];
    itree[S + now[i]].second = 1;
    update(S + now[i]);
    alive.insert(pair<long long, long long>(a[i], now[i]));
  }
  for (i = 0; i < m; i++) {
    if (q[i][0] == 1) {
      itree[S + now[q[i][1]]].first = 0;
      itree[S + now[q[i][1]]].second = 0;
      update(S + now[q[i][1]]);
      alive.erase(pair<long long, long long>(u[now[q[i][1]]], now[q[i][1]]));
      now[q[i][1]] = q2[i];
      itree[S + now[q[i][1]]].first = q[i][2];
      itree[S + now[q[i][1]]].second = 1;
      update(S + now[q[i][1]]);
      alive.insert(pair<long long, long long>(u[now[q[i][1]]], now[q[i][1]]));
    } else {
      double low = 0, high = 1e18, mid;
      for (j = 0; j < 100; j++) {
        mid = (low + high) / 2;
        set<pair<long long, long long> >::iterator x = alive.upper_bound(
            pair<long long, long long>((long long)mid, ((1 << 30) - 1)));
        if (x == alive.begin()) {
          low = mid;
          continue;
        }
        x--;
        pair<long long, long long> hab = getsum(S + 0, S + (*x).second);
        if ((double)mid * (double)hab.second - (double)hab.first >= q[i][1])
          high = mid;
        else
          low = mid;
      }
      printf("%lf\n", mid);
    }
  }
  return 0;
}
