#include <bits/stdc++.h>
using namespace std;
typedef pair<long long, long long> ll;
typedef vector<long long> vl;
typedef vector<ll> vll;
typedef vector<vl> vvl;
template <typename T>
ostream &operator<<(ostream &o, vector<T> v) {
  if (v.size() > 0) o << v[0];
  for (unsigned i = 1; i < v.size(); i++) o << " " << v[i];
  return o << "\n";
}
template <typename U, typename V>
ostream &operator<<(ostream &o, pair<U, V> p) {
  return o << "(" << p.first << ", " << p.second << ") ";
}
template <typename T>
istream &operator>>(istream &in, vector<T> &v) {
  for (unsigned i = 0; i < v.size(); i++) in >> v[i];
  return in;
}
template <typename T>
istream &operator>>(istream &in, pair<T, T> &p) {
  in >> p.first;
  in >> p.second;
  return in;
}
vl tree(4 * 210000), lazy(4 * 210000);
long long global_size = 0;
void update(long long node, long long start, long long end, long long l,
            long long r, long long val) {
  if (lazy[node] != 0) {
    tree[node] += (end - start + 1) * lazy[node];
    if (start != end) {
      lazy[node * 2 + 1] += lazy[node];
      lazy[node * 2 + 2] += lazy[node];
    }
    lazy[node] = 0;
  }
  if (start > end or start > r or end < l) return;
  if (start >= l and end <= r) {
    tree[node] += (end - start + 1) * val;
    if (start != end) {
      lazy[node * 2 + 1] += val;
      lazy[node * 2 + 2] += val;
    }
    return;
  }
  long long mid = (start + end) / 2;
  update(node * 2 + 1, start, mid, l, r, val);
  update(node * 2 + 2, mid + 1, end, l, r, val);
  tree[node] = tree[node * 2 + 1] + tree[node * 2 + 2];
}
long long queryRange(long long node, long long start, long long end,
                     long long l, long long r) {
  if (start > end or start > r or end < l) return 0;
  if (lazy[node] != 0) {
    tree[node] += (end - start + 1) * lazy[node];
    if (start != end) {
      lazy[node * 2 + 1] += lazy[node];
      lazy[node * 2 + 2] += lazy[node];
    }
    lazy[node] = 0;
  }
  if (start >= l and end <= r) return tree[node];
  long long mid = (start + end) / 2;
  long long p1 = queryRange(node * 2 + 1, start, mid, l, r);
  long long p2 = queryRange(node * 2 + 2, mid + 1, end, l, r);
  return (p1 + p2);
}
long long fun(long long x) { return queryRange(0, 0, 210000, x, x); }
int main() {
  std::ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cout.precision(20);
  long long n;
  cin >> n;
  while (n--) {
    long long x;
    cin >> x;
    if (x == 1) {
      long long y, z;
      cin >> y >> z;
      update(0, 0, 210000, 0, y - 1, z);
    } else if (x == 2) {
      long long k;
      cin >> k;
      global_size++;
      update(0, 0, 210000, global_size, global_size, k);
    } else {
      update(0, 0, 210000, global_size, global_size,
             -queryRange(0, 0, 210000, global_size, global_size));
      global_size--;
    }
    cout << (1.0L * queryRange(0, 0, 210000, 0, 210000)) /
                (1.0L * (global_size + 1))
         << "\n";
  }
  return 0;
}
