/* 题目: 模拟排队的实现,但是若是有同伙的话,这些家伙就会插队,排到他们的同伙的后面,要不就乖乖地排到队伍的后面。现在给出朋友关系以及进队出队的顺序,问你当出队时是谁在出队 分析: 利用优先队列,重载小于号,使得优先级最大的先出队,优先级的定义如下:当前面有同伙时,按照前面的同伙的优先级来插入,若没有的话,就按照现在的优先插入。当优先级相同时,按照先进队的优先级越大就越大。 */ #include <iostream> #include <cstdio> #include <queue> #include <cstring> using namespace std; const int X = 100005; const int maxn = 999999+1; int ha[maxn]; int use[maxn]; int map[maxn]; struct node { int id,p; int cnt; int qq; friend bool operator < (node a,node b) { return a.p>b.p||(a.p==b.p&&a.qq>b.qq); } }p[X]; int main() { freopen("sum.in","r",stdin); int x,n; node aa; char s[21]; int ncase = 0; while(cin>>n,n) { for(int i=0;i<maxn;i++) use[i] = -1; memset(map,0,sizeof(map)); printf("Scenario #%d\n",++ncase); for(int i=0;i<=999999;i++) ha[i] = -1; int cnt = 0; priority_queue<node> q; while(!q.empty()) q.pop(); for(int i=0;i<n;i++) { scanf("%d",&x); while(x--) { scanf("%d",&p[cnt].id); ha[p[cnt].id] = cnt; p[cnt].cnt = i; cnt++; } } int ret = 0; int y; int qqq = 0; while(scanf("%s",s),s[0]!='S') { if(s[0]=='E') { scanf("%d",&x); x = ha[x]; y = p[x].cnt; p[x].qq = qqq++; if(use[y]!=-1&&map[y]) p[x].p = use[y]; else { p[x].p = ret; use[y] = ret; ret++; } map[y]++; q.push(p[x]); } else { aa = q.top(); q.pop(); y = aa.cnt; map[y]--; printf("%d\n",aa.id); } } printf("\n"); } return 0; }