#include #include #include #include #include #define repeat(i,n) for (int i = 0; (i) < (n); ++(i)) #define whole(f,x,...) ([&](decltype((x)) whole) { return (f)(begin(whole), end(whole), ## __VA_ARGS__); })(x) using namespace std; template T sortunique(T xs) { whole(sort, xs); xs.erase(whole(unique, xs), xs.end()); return xs; } template int index(vector const & xs, T x) { return whole(lower_bound, xs, x) - xs.begin(); } int scoreof(int level, int solved) { assert (solved >= 1); return 50*level + 250*level/(4+solved); } int main() { // input int n; cin >> n; vector level(n); repeat (i,n) cin >> level[i]; int query; cin >> query; vector name(query); vector action(query); repeat (t,query) cin >> name[t] >> action[t]; // prepare const int max_score = 100 * whole(accumulate, level, 0); vector ids = sortunique(name); int m = ids.size(); // answer vector solved(n); vector score(m); vector > inv(max_score + 1); repeat (id,m) inv[0].push_back(id); repeat (t,query) { int id = index(ids, name[t]); int j = score[id]; if (action[t] == '?') { int a = 0; repeat (i,j) a += inv[i].size(); int b = inv[j].size() - (whole(find, inv[j], id) - inv[j].begin()) - 1; cout << m-a-b << endl; } else { inv[j].erase(whole(find, inv[j], id)); int i = action[t] - 'A'; solved[i] += 1; j = score[id] += scoreof(level[i], solved[i]); inv[j].push_back(id); } } return 0; }