#include <iostream>
#include <queue>
using std::vector;
using std::cout;
using std::endl;
using std::fill;
using std::min;

template<typename data_t, typename out_t>
struct MovingAverage {
	size_t window, size, ptr;
	vector<data_t> data;
	out_t sum;
	explicit MovingAverage(size_t n) {
		init(n);
	}
	void init(size_t n) {
		data.resize(n);
		fill(data.begin(), data.end(), 0);
		window = n;
		size = 0;
		ptr = 0;
		sum = 0;
	}
	out_t feed(data_t val) {
		sum = sum + val - data[ptr];
		data[ptr] = val;
		size = min(size + 1, window);
		ptr = (ptr + 1) % window;
		return sum / size;
	}
};

int main() {
	vector<int> array{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
	MovingAverage<int, double> avg(0);
	for (size_t size = 1; size <= array.size(); size++) {
		avg.init(size);
		cout << "size " << size << ": ";
		for (int elem: array) {
			cout << avg.feed(elem) << " ";
		}
		cout << endl;
	}
	return 0;
}