#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxN = 1e6 + 5, inf = 0x3f3f3f3f, mod = 317847191;
struct opt
{
char c;
int num;
}op[maxN];
int n, m, a[maxN], ans[maxN];
int qpow(int a, int b)
{
int p = b, ans = 1;
ans %= mod;
while(p > 0)
{
if(p % 2 != 0)
ans = ans * a % mod;
a = a * a % mod;
p = p >> 1;
}
return ans % mod;
}
signed main()
{
scanf("%lld %lld", &n, &m);
for (int i = 1; i <= n; i ++)
{
scanf("%lld", &a[i]);
}
sort(a + 1, a + 1 + n);
for (int i = 1; i <= m; i ++)
{
cin >> op[i].c;
if (op[i].c == 'D')
{
scanf("%lld", &op[i].num);
int x = lower_bound(a, a + 1 + n, op[i].num) - a;
a[x] = -1;
}
}
int minn = inf, maxn = -inf, mul = 1;
for (int i = 1; i <= n; i ++)
{
if (a[i] == -1) continue;
minn = min(minn, a[i]);
maxn = max(maxn, a[i]);
mul = (mul * a[i]) % mod;
}
int cnt = 0;
for (int i = m; i >= 1; i --)
{
if (op[i].c == 'D')
{
minn = min(minn, op[i].num);
maxn = max(maxn, op[i].num);
mul = (mul * op[i].num) % mod;
}
else if (op[i].c == 'T') ans[++ cnt] = mul;
else if (op[i].c == 'B') ans[++ cnt] = maxn;
else if (op[i].c == 'S') ans[++ cnt] = minn;
else ans[++ cnt] = qpow(maxn, minn);
}
for (int i = cnt; i >= 1; i --)
{
cout << ans[i] << endl;
}
return 0;
}
离线做法