#include<cstdio> #include<cstring> #include<map> #include<set> #include<algorithm> using namespace std; const int N = 100100; const int M = 5000; int n, m, sol_num, tot; int arr[11][M]; int cnt[N][11]; int sum[11]; bool solve[N][10]; char s1[20], s2[20]; int solved[N]; int pen[N]; int last[N]; struct Team{ int id, ac; Team(){} Team(int id, int ac):id(id),ac(ac){} bool operator < (const Team &A)const{ return ac<A.ac; } }; int lowbit(int x){ return x&(-x); } void add(int sol, int x, int v){ if(x==0){ arr[sol][x]+=v; return; } for(; x<M; x+=lowbit(x)) arr[sol][x]+=v; } int cal(int sol, int x){ if(x<0) return 0; int res = arr[sol][0]; for(; x>0; x-=lowbit(x)) res += arr[sol][x]; return res; } Team t[N]; map<int, set<Team> > MP[11]; set<int> ST; void init(){ for(int i=1; i<=m; i++){ MP[i].clear(); } ST.clear(); for(int i=0; i<n; i++){ ST.insert(i); t[i] = Team(i,-10); last[i] = -10; } tot = 0; sol_num = 0; memset(solved, 0, sizeof(solved)); memset(pen, 0, sizeof(pen)); memset(arr, 0, sizeof(arr)); memset(solve, 0, sizeof(solve)); memset(cnt, 0, sizeof(cnt)); memset(sum, 0, sizeof(sum)); } inline void in(int &x){ char c=getchar(); x = 0; while(c<48 || c>57) c=getchar(); while(c>=48 && c<=57){ x = x*10+c-48; c = getchar(); } } inline void read(int &x){ char c=getchar(); x = c-'A'; } void submit(){ int min, id, flag, pro; in(min); in(id); read(pro); in(flag); if(min - last[id] < 5 || solve[id][pro]) return; last[id] = min; if(flag){ printf("[%d][%c]\n", id, pro+'A'); int sol = solved[id]; int penlty = pen[id]; if(sol){ MP[sol][penlty].erase(t[id]); add(sol, penlty, -1); sum[sol]--; } else{ sol_num++; ST.erase(id); } sol++; penlty += min + cnt[id][pro]*20; solved[id]++; pen[id] = penlty; t[id].ac = ++tot; MP[sol][penlty].insert(t[id]); add(sol, penlty, 1); solve[id][pro]=1; sum[sol]++; } else{ cnt[id][pro]++; } } int R(){ int id, res; in(id); if(solved[id]==0) return sol_num+1; res = cal(solved[id], pen[id]-1)+1; for(int i=solved[id]+1; i<=m; i++) res+=sum[i]; return res; } int find(int sol, int rank){ int low=0, top=M, mid; int ans = M; while(low<=top){ mid = (low+top)>>1; int res = cal(sol, mid); if(res >= rank){ ans = min(ans, mid); top = mid-1; } else{ low = mid+1; } } int tmp = cal(sol, ans-1); if(tmp + 1 != rank) return -1; return MP[sol][ans].begin()->id; } int T(){ int rank; in(rank); if(rank > n) return -1; if(rank == sol_num+1) return *ST.begin(); if(rank > sol_num) return -1; int i, res = 0; for(i=m; i>=0; i--){ res += sum[i]; if(res >= rank) break; } res -= sum[i]; return find(i, rank - res); } int main(){ while(~scanf("%d %d", &n, &m)){ init(); while(~scanf("%s", s1) && s1[0]!='C'){ if(s1[0]=='S') submit(); else if(s1[0]=='T') printf("%d\n", T()); else printf("%d\n", R()); } scanf("%s", s1); puts(""); } return 0; }