#include <stdio.h>
#include<iomanip>
#include<iostream>
#include <algorithm>
#include<string.h>
#include<string>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#include<bits/stdc++.h>
using namespace std;
#pragma warning(disable:4996)
#define inf 0x3f3f3f3f
#define INFll 0x3f3f3f3f3f3f3f3f
#define PI 3.1415926535898
#define ll long long
const double eps = 1e-6;
typedef long long LL;
typedef pair<int, int> pii;
//
//LL GCD(LL a, LL b)
//{
//	if (a < b)
//		swap(a, b);
//	if (b == 0)
//		return a;
//	return GCD(b, a % b);
//}
//const int N = 2e5 + 10;
//const int M = 1e5 + 10;
//const ll mod = 998244353;
//
//LL n = N;
//LL a[N], c[N], d[N];
//void updata(LL x, LL v)
//{
//	LL i = x;
//	while (x <= (n << 1))
//	{
//		c[x] += v;
//		d[x] += v * (i - 1);
//		x += (x & -x);
//	}
//}
//LL sum(LL x)
//{
//	LL res = 0, i = x;
//	while (x > 0)
//	{
//		res += i * c[x] - d[x];
//		x -= (x & -x);
//	}
//	return res;
//}



//inline int read() {
//	int x = 0, f = 1; char ch = getchar();
//	while (ch < '0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); }
//	while (ch <= '9' && ch >= '0') { x = x * 10 + ch - '0'; ch = getchar(); }
//	return x * f;
//}

//
//LL fac[N], inv[N];
//LL quick_pow(LL a, LL b)
//{
//	LL ans = 1 % mod;
//	while (b) {
//		if (b & 1) ans = (ans * a) % mod;
//		b >>= 1;
//		a = (a * a) % mod;
//	}
//	return ans;
//}
//void init()
//{
//	fac[0] = 1;
//	inv[0] = 1;
//	for (int i = 1; i <= N - 2; i++)
//	{
//		fac[i] = (fac[i - 1] * i) % mod;
//		//inv[i] = quick_pow(fac[i], mod - 2);
//		inv[i] = mod - mod / i * inv[mod % i] % mod;
//	}
//}
//LL C(LL a, LL b)	//计算组合数C(a, b)
//{
//	if (a < b || b < 0) return 0;
//	return fac[a] * ((inv[a - b] * inv[b]) % mod) % mod;
//}


//int prime[N];
//int vis[N];
//void get_prime()
//{
//	//vis数组中为0表示这个下标是素数
//	for (int i = 2; i < N; i++)
//	{
//		if (!vis[i])
//		{
//			prime[++prime[0]] = i;//prime[0]放素数个数,后面依次放素数
//		}
//		for (int j = 1; j <= prime[0] && i * prime[j] < N; j++)
//		{
//			vis[i * prime[j]] = 1;
//			if (i % prime[j] == 0)
//				break;
//		}
//	}
//}
//struct no {
//	LL first;
//	no() {}
//	no(LL first) :first(first) {}
//	bool operator<(const no& a)const
//	{
//		return first > a.first;//大顶堆
//	}
//};
const int N = 55;
const int mod = 998244353;
int sum(int a, int b) {
	int s = a + b;
	if (s >= mod) s -= mod;
	return s;
}
int sub(int a, int b) {
	int s = a - b;
	if (s < 0) s += mod;
	return s;
}
int mult(int a, int b) {
	return (1LL * a * b) % mod;
}
int n;
const int maxN = 505;
char tp[maxN];
int who[maxN];
int dp[maxN][maxN];
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> tp[i];
		if (tp[i] == '+') cin >> who[i];
	}
	int ans = 0;
	for (int i = 1; i <= n; i++) {
		if (tp[i] == '+') {
			memset(dp, 0, sizeof(dp));
			dp[0][0] = 1;
			for (int x = 1; x <= n; x++) {
				for (int cur = 0; cur <= x - 1; cur++) {
					if (x == i) {
						dp[x][cur] = sum(dp[x][cur], dp[x - 1][cur]);
					}
					else if (x < i) {
						dp[x][cur] = sum(dp[x][cur], dp[x - 1][cur]);
						if (tp[x] == '-') {
							dp[x][max(cur - 1, 0)] = sum(dp[x][max(cur - 1, 0)], dp[x - 1][cur]);
						}
						else if (tp[x] == '+' && who[x] <= who[i]) {
							dp[x][cur + 1] = sum(dp[x][cur + 1], dp[x - 1][cur]);
						}
						else {
							dp[x][cur] = sum(dp[x][cur], dp[x - 1][cur]);
						}
					}
					else {
						dp[x][cur] = sum(dp[x][cur], dp[x - 1][cur]);
						if (tp[x] == '-') {
							if (cur > 0) {
								dp[x][cur - 1] = sum(dp[x][cur - 1], dp[x - 1][cur]);
							}
						}
						else if (tp[x] == '+' && who[x] < who[i]) {
							dp[x][cur + 1] = sum(dp[x][cur + 1], dp[x - 1][cur]);
						}
						else {
							dp[x][cur] = sum(dp[x][cur], dp[x - 1][cur]);
						}
					}
				}
			}
			int coef = 0;
			for (int cur = 0; cur <= n; cur++) {
				coef = sum(coef, dp[n][cur]);
			}
			ans = sum(ans, mult(coef, who[i]));
		}
	}
	cout << ans << '\n';
}