#include #include #include struct agent { char name[21]; unsigned value; unsigned order; } sell[1000], buy[1000], wcp[1000]; struct agorig { char name[21]; char c; unsigned value; } ags[1000]; static int acmp(struct agent *_1, struct agent *_2) { return _1->value - _2->value; } static int ocmp(struct agent *_1, struct agent *_2) { return _1 ->order - _2->order; } static int findborder(struct agent *ag, int count, int border) { int l = 0, r = count; int mid; while(mid = (l+r)/2, (mid > 0 && ag[mid - 1].value >= border) || (ag[mid].value < border)) { if(r - l < 1) return mid; if(ag[mid].value < border) l = mid + 1; else r = mid - 1; } return mid; } static int process() { int num, buyc = 0, sellc = 0, v1, v2, i; char name[11], cmd[5]; scanf("%d %s ", &num, name); if (!num &&!strcmp("END", name)) return 0; printf("%s\n", name); for(i = 0; i < num; i ++) { scanf("%s %s %d.%d ", ags[i].name, cmd, &v1, &v2); ags[i].value = v1 * 1000 + v2; if((ags[i].c = *cmd) == 'b') { buy[buyc].value = 1000*v1 + v2; buy[buyc].order = i; strcpy(buy[buyc ++].name, ags[i].name); } else { sell[sellc].value = 1000*v1 + v2; sell[sellc].order = i; strcpy(sell[sellc ++].name, ags[i].name); } } qsort(sell, sellc, sizeof *sell, acmp); qsort(buy, buyc, sizeof *sell, acmp); for(i = 0; i < num; i ++) { int b, j; if(ags[i].c == 'b') { b = findborder(sell, sellc, ags[i].value); while(b < sellc - 1 && sell[b].value == ags[i].value) b ++; memcpy(wcp, sell, b * sizeof *sell); } else { b = findborder(buy, buyc, ags[i].value); memcpy(wcp, buy + b, (buyc - b) * sizeof *buy); b = buyc - b; } qsort(wcp, b, sizeof *wcp, ocmp); printf("%s:", ags[i].name); for(j = 0; j < b; j ++) printf(" %s", wcp[j].name); if(!b) puts(" NO-ONE"); else putchar('\n'); } return 1; } int main(int argc, char *argv[]) { while(process()); return 0; }