#include using namespace std; #define int long long typedef vectorvint; typedef pairpint; typedef vectorvpint; #define rep(i,n) for(int i=0;i<(n);i++) #define reps(i,f,n) for(int i=(f);i<(n);i++) #define all(v) (v).begin(),(v).end() #define each(it,v) for(__typeof((v).begin()) it=(v).begin();it!=(v).end();it++) #define pb push_back #define fi first #define se second templateinline void chmin(A &a,B b){if(a>b)a=b;} templateinline void chmax(A &a,B b){if(a>19))^(t^(t>>8)) ); } struct node{ int p,t; node *lch,*rch; int cnt; node(int p,int t):p(p),t(t),lch(NULL),rch(NULL),cnt(1){} }; inline int cnt(node *t){return t?t->cnt:0;} inline node *update(node *t){ if(!t)return NULL; t->cnt=cnt(t->lch)+1+cnt(t->rch); return t; } node *merge(node *a,node *b){ if(!a)return b; if(!b)return a; if(r()%(cnt(a)+cnt(b))rch=merge(a->rch,b); return update(a); } else{ b->lch=merge(a,b->lch); return update(b); } } pairsplit(node *t,int k){ if(!t)return make_pair((node *)NULL,(node *)NULL); if(k<=cnt(t->lch)){ pairs=split(t->lch,k); t->lch=s.second; return make_pair(s.first,update(t)); } else{ pairs=split(t->rch,k-cnt(t->lch)-1); t->rch=s.first; return make_pair(update(t),s.second); } } int f(int a,int b){ return a*50+(500*a)/(8+2*b); } node *root; int find(node *t,pint v){ if(!t)return 0; if(t->pp==v.fi&&t->t>v.se))return find(t->lch,v); return cnt(t->lch)+1+find(t->rch,v); } void insert(pint v){ int t=find(root,v); pairs=split(root,t); root=merge(s.first,merge(new node(v.fi,v.se),s.second)); } void erase(pint v){ int t=find(root,v); pairs1=split(root,t-1); pairs2=split(s1.second,1); root=merge(s1.first,s2.second); } void debug(node *t){ if(t==NULL)return; debug(t->lch); cout<<"("<p<<","<t<<") "; debug(t->rch); } void debug(){ cout<<"[ ";debug(root); cout<<" ]"<scr; rep(i,T){ string s; char c; cin>>s>>c; if(c=='?'){ printf("%lld\n",find(root,scr[s])); } else{ int tmp=f(L[c-'A'],++cnt[c-'A']); if(scr.find(s)==scr.end()){ scr[s]={tmp,i}; insert({tmp,i}); } else{ erase(scr[s]); scr[s].fi+=tmp; scr[s].se=i; insert(scr[s]); } } } return 0; }