//неявное дд, переворачивания

#include <iostream>
#include <random>

using namespace std;
using type = int;

mt19937 rnd(35465464);

struct Node
{

	int y;
	type data;
	Node* left;
	Node* right;
	int tSize;
	long long tSum;
	bool tobeRev = false;

	Node(type d)
	{
		y = rnd();
		data = d;
		left = nullptr;
		right = nullptr;
		tSize = 1;
		tSum = d;
	};

};


void push(Node* t)
{
	if (t == nullptr)
		return;
	if (!t->tobeRev)
		return;

	auto temp = t->left;
	t->left = t->right;
	t->right = temp;

	t->tobeRev = false;
	if (t->left != nullptr) t->left->tobeRev ^= 1;
	if (t->right != nullptr) t->right->tobeRev ^= 1;

}

int getSize(Node* t)
{
	if (t == nullptr)
		return 0;
	else
		return t->tSize;
}

long long getSum(Node* t)
{
	if (t == nullptr)
		return 0;
	else
		return t->tSum;
}


void recalc(Node* t)
{
	t->tSize = getSize(t->left) + getSize(t->right) + 1;
	t->tSum = getSum(t->left) + getSum(t->right) + t->data;
}


pair<Node*, Node*> Split(Node* t, int x)
{
	if (t == nullptr)
	{
		return { nullptr, nullptr };
	}
	push(t);
	if (getSize(t->left) >= x)
	{
		auto temp = Split(t->left, x);
		t->left = temp.second;
		recalc(t);
		return { temp.first, t };
	}
	else
	{
		auto temp = Split(t->right, x - getSize(t->left) - 1);
		t->right = temp.first;
		recalc(t);
		return { t, temp.second };
	}
}

Node* Merge(Node* l, Node* r)
{
	if (l == nullptr)
		return r;
	if (r == nullptr)
		return l;
	if (l->y > r->y)
	{
		push(l);
		l->right = Merge(l->right, r);
		recalc(l);
		return l;
	}
	else
	{
		push(r);
		r->left = Merge(l, r->left);
		recalc(r);
		return r;
	}
}

Node* Insert(Node* t, type d) //вставка в конец; для вставки в произвольную позицию модифицируйте вставку с явным ключом
{
	auto nodex = new Node(d);
	return Merge(t, nodex);
}


long long Sum_R(Node* t, int R)
{
	if (!t)
		return 0;
	push(t);
	if (getSize(t->left) == R - 1)
		return getSum(t->left) + t->data;
	if (getSize(t->left) > R - 1)
		return Sum_R(t->left, R);
	else
		return Sum_R(t->right, R - getSize(t->left) - 1) + getSum(t->left) + t->data;
}

void SetToBeRev(Node* t, int l, int r) //в этой функции (вернее, ее аналоге) на паре были проблемы, написала лучше
{
	auto temp = Split(t, r);
	auto temp2 = Split(temp.first, l - 1);
	if (temp2.second != nullptr)
		temp2.second->tobeRev ^= 1;
	t = Merge(temp2.first, Merge(temp2.second, temp.second));
}


int main()
{
	Node* tree = nullptr;
	while (true)
	{
		char str;
		type N;
		cin >> str;
		if (str == '+')
		{
			cin >> N;
			tree = Insert(tree, N);
		}
		if (str == 's')
		{
			long long res;
			int l, r;
			cin >> l >> r;
			res = Sum_R(tree, r) - Sum_R(tree, l - 1);
			cout << res << endl;
		}
		if (str == 'r')
		{
			int l, r;
			cin >> l >> r;
			SetToBeRev(tree, l, r);
		}
		if (str == 'o')
		{
			int i;
			for (i = 1; i <= 5; i++)
			{
				cout << Sum_R(tree, i) - Sum_R(tree, i - 1) << " ";
			}

		}

	}
	return 0;
}
