#include <bits/stdc++.h>
using namespace std;
struct tree {
  int l;
  int r;
  int ls;
  int rs;
  long long data;
};
struct haha {
  long long d;
  long long p;
};
long long a[212345];
long long n, q, numsiz, numtot;
int tot = 0;
tree tr[943210];
haha b[943210];
void maketree(int, int);
void add(int, int, int, int);
void qs(int, int);
int fi(int, int);
void sw(haha&, haha&);
void qss(int, int);
int main() {
  int i, l, r, ai, xi, ki, t;
  long long tmp;
  cin >> n;
  numsiz = 1;
  numtot = 0;
  memset(tr, 0, sizeof(tr));
  tot = 1;
  maketree(1, n);
  while (n--) {
    cin >> t;
    if (t == 1) {
      cin >> ai >> xi;
      if (ai > (numsiz)) ai = numsiz;
      add(1, 1, ai, xi);
      numtot += ai * xi;
      printf("%.6lf\n", ((double)numtot) / (numsiz));
    }
    if (t == 2) {
      cin >> ki;
      numsiz++;
      add(1, numsiz, numsiz, ki);
      numtot += ki;
      printf("%.6lf\n", ((double)numtot) / (numsiz));
    }
    if (t == 3) {
      int tmp = fi(1, numsiz);
      numtot -= tmp;
      add(1, numsiz, numsiz, -tmp);
      numsiz--;
      printf("%.6lf\n", ((double)numtot) / (numsiz));
    }
  }
}
void sw(haha& a, haha& b) {
  haha t;
  t = a;
  a = b;
  b = t;
}
int fi(int now, int x) {
  int ret = 0;
  ret += tr[now].data;
  if (tr[now].l == tr[now].r) return ret;
  int mid = (tr[now].l + tr[now].r) >> 1;
  if (x <= mid)
    ret += fi(tr[now].ls, x);
  else
    ret += fi(tr[now].rs, x);
  return ret;
}
void qs(int l, int r) {
  int i, j, x;
  i = l;
  j = r;
  x = b[(l + r) >> 1].d;
  do {
    while (b[i].d < x) i++;
    while (b[j].d > x) j--;
    if (i <= j) {
      sw(b[i], b[j]);
      i++;
      j--;
    }
  } while (i <= j);
  if (i < r) qs(i, r);
  if (l < j) qs(l, j);
}
void qss(int l, int r) {
  int i, j, x, t;
  i = l;
  j = r;
  x = a[(i + j) >> 1];
  do {
    while (a[i] < x) i++;
    while (a[j] > x) j--;
    if (i <= j) {
      t = a[i];
      a[i] = a[j];
      a[j] = t;
      i++;
      j--;
    }
  } while (i <= j);
  if (i < r) qss(i, r);
  if (l < j) qss(l, j);
}
void add(int now, int l, int r, int data) {
  if (r < l) return;
  if (tr[now].l >= l && tr[now].r <= r) {
    tr[now].data += data;
    return;
  }
  if (tr[now].r < l || tr[now].l > r) return;
  add(tr[now].ls, l, r, data);
  add(tr[now].rs, l, r, data);
}
void maketree(int l, int r) {
  tr[tot].l = l;
  tr[tot].r = r;
  if (l == r) {
    tr[tot].ls = -1;
    tr[tot].rs = -1;
    return;
  }
  int now = tot, mid = (l + r) >> 1;
  tot++;
  tr[now].ls = tot;
  maketree(l, mid);
  tot++;
  tr[now].rs = tot;
  maketree(mid + 1, r);
}
