package main
import (
"bufio"
"fmt"
"os"
"sort"
"strconv"
"strings"
)
type PasanganKlub struct {
Klub string
Poin int
}
type Klasemen struct {
poin map[ string] int
urutan [ ] string // menyimpan urutan klub saat didaftarkan (untuk urutan tampil awal)
}
func NewKlasemen( klub [ ] string) * Klasemen {
poin := make( map[ string] int )
urutan := make( [ ] string, 0 , len( klub) )
for _, k := range klub {
poin[ k] = 0
urutan = append( urutan, k)
}
return & Klasemen{ poin: poin, urutan: urutan}
}
func ( k * Klasemen) tambahKlubJikaBelumAda( klub string) {
if _, ada := k.poin [ klub] ; ! ada {
k.poin [ klub] = 0
k.urutan = append( k.urutan , klub)
}
}
func ( k * Klasemen) CatatPermainan( klubKandang, klubTandang, skor string) {
k.tambahKlubJikaBelumAda ( klubKandang)
k.tambahKlubJikaBelumAda ( klubTandang)
bagian := strings.Split ( skor, ":" )
if len( bagian) != 2 {
panic( fmt.Sprintf ( "format skor tidak valid: %q" , skor) )
}
skorKandang, err1 := strconv.Atoi ( strings.TrimSpace ( bagian[ 0 ] ) )
skorTandang, err2 := strconv.Atoi ( strings.TrimSpace ( bagian[ 1 ] ) )
if err1 != nil || err2 != nil {
panic( fmt.Sprintf ( "format skor tidak valid: %q" , skor) )
}
switch {
case skorKandang > skorTandang:
k.poin [ klubKandang] += 3
case skorKandang < skorTandang:
k.poin [ klubTandang] += 3
default :
k.poin [ klubKandang] += 1
k.poin [ klubTandang] += 1
}
}
func ( k * Klasemen) CetakKlasemen( ) [ ] PasanganKlub {
hasil := make( [ ] PasanganKlub, 0 , len( k.poin ) )
for _, klub := range k.urutan {
hasil = append( hasil, PasanganKlub{ Klub: klub, Poin: k.poin [ klub] } )
}
sort.SliceStable ( hasil, func( i, j int ) bool {
return hasil[ i] .Poin > hasil[ j] .Poin
} )
return hasil
}
func ( k * Klasemen) AmbilPeringkat( nomorPeringkat int ) string {
klasemen := k.CetakKlasemen ( )
if nomorPeringkat < 1 || nomorPeringkat > len( klasemen) {
return ""
}
return klasemen[ nomorPeringkat- 1 ] .Klub
}
func main( ) {
reader := bufio.NewReader ( os.Stdin )
baca := func( ) string {
s, _ := reader.ReadString ( '\n ' )
return strings.TrimSpace ( s)
}
n, _ := strconv.Atoi ( baca( ) )
var namaKlub [ ] string
for len( namaKlub) < n {
baris := baca( )
namaKlub = append( namaKlub, strings.Fields ( baris) ...)
}
klasemen := NewKlasemen( namaKlub)
m, _ := strconv.Atoi ( baca( ) )
for i := 0 ; i < m; i++ {
baris := strings.Fields ( baca( ) )
klasemen.CatatPermainan ( baris[ 0 ] , baris[ 1 ] , baris[ 2 ] )
}
fmt.Println ( "Klasemen:" )
for i, pasangan := range klasemen.CetakKlasemen ( ) {
fmt.Printf ( "%d. %s => %d poin\n " , i+ 1 , pasangan.Klub , pasangan.Poin )
}
q, _ := strconv.Atoi ( baca( ) )
for i := 0 ; i < q; i++ {
nomor, _ := strconv.Atoi ( baca( ) )
fmt.Printf ( "Peringkat ke-%d: %s\n " , nomor, klasemen.AmbilPeringkat ( nomor) )
}
}
cGFja2FnZSBtYWluCgppbXBvcnQgKAoJImJ1ZmlvIgoJImZtdCIKCSJvcyIKCSJzb3J0IgoJInN0cmNvbnYiCgkic3RyaW5ncyIKKQoKdHlwZSBQYXNhbmdhbktsdWIgc3RydWN0IHsKCUtsdWIgc3RyaW5nCglQb2luIGludAp9Cgp0eXBlIEtsYXNlbWVuIHN0cnVjdCB7Cglwb2luICAgbWFwW3N0cmluZ11pbnQKCXVydXRhbiBbXXN0cmluZyAvLyBtZW55aW1wYW4gdXJ1dGFuIGtsdWIgc2FhdCBkaWRhZnRhcmthbiAodW50dWsgdXJ1dGFuIHRhbXBpbCBhd2FsKQp9CgpmdW5jIE5ld0tsYXNlbWVuKGtsdWIgW11zdHJpbmcpICpLbGFzZW1lbiB7Cglwb2luIDo9IG1ha2UobWFwW3N0cmluZ11pbnQpCgl1cnV0YW4gOj0gbWFrZShbXXN0cmluZywgMCwgbGVuKGtsdWIpKQoJZm9yIF8sIGsgOj0gcmFuZ2Uga2x1YiB7CgkJcG9pbltrXSA9IDAKCQl1cnV0YW4gPSBhcHBlbmQodXJ1dGFuLCBrKQoJfQoJcmV0dXJuICZLbGFzZW1lbntwb2luOiBwb2luLCB1cnV0YW46IHVydXRhbn0KfQoKZnVuYyAoayAqS2xhc2VtZW4pIHRhbWJhaEtsdWJKaWthQmVsdW1BZGEoa2x1YiBzdHJpbmcpIHsKCWlmIF8sIGFkYSA6PSBrLnBvaW5ba2x1Yl07ICFhZGEgewoJCWsucG9pbltrbHViXSA9IDAKCQlrLnVydXRhbiA9IGFwcGVuZChrLnVydXRhbiwga2x1YikKCX0KfQoKZnVuYyAoayAqS2xhc2VtZW4pIENhdGF0UGVybWFpbmFuKGtsdWJLYW5kYW5nLCBrbHViVGFuZGFuZywgc2tvciBzdHJpbmcpIHsKCWsudGFtYmFoS2x1Ykppa2FCZWx1bUFkYShrbHViS2FuZGFuZykKCWsudGFtYmFoS2x1Ykppa2FCZWx1bUFkYShrbHViVGFuZGFuZykKCgliYWdpYW4gOj0gc3RyaW5ncy5TcGxpdChza29yLCAiOiIpCglpZiBsZW4oYmFnaWFuKSAhPSAyIHsKCQlwYW5pYyhmbXQuU3ByaW50ZigiZm9ybWF0IHNrb3IgdGlkYWsgdmFsaWQ6ICVxIiwgc2tvcikpCgl9CgoJc2tvckthbmRhbmcsIGVycjEgOj0gc3RyY29udi5BdG9pKHN0cmluZ3MuVHJpbVNwYWNlKGJhZ2lhblswXSkpCglza29yVGFuZGFuZywgZXJyMiA6PSBzdHJjb252LkF0b2koc3RyaW5ncy5UcmltU3BhY2UoYmFnaWFuWzFdKSkKCWlmIGVycjEgIT0gbmlsIHx8IGVycjIgIT0gbmlsIHsKCQlwYW5pYyhmbXQuU3ByaW50ZigiZm9ybWF0IHNrb3IgdGlkYWsgdmFsaWQ6ICVxIiwgc2tvcikpCgl9CgoJc3dpdGNoIHsKCWNhc2Ugc2tvckthbmRhbmcgPiBza29yVGFuZGFuZzoKCQlrLnBvaW5ba2x1YkthbmRhbmddICs9IDMKCWNhc2Ugc2tvckthbmRhbmcgPCBza29yVGFuZGFuZzoKCQlrLnBvaW5ba2x1YlRhbmRhbmddICs9IDMKCWRlZmF1bHQ6CgkJay5wb2luW2tsdWJLYW5kYW5nXSArPSAxCgkJay5wb2luW2tsdWJUYW5kYW5nXSArPSAxCgl9Cn0KCmZ1bmMgKGsgKktsYXNlbWVuKSBDZXRha0tsYXNlbWVuKCkgW11QYXNhbmdhbktsdWIgewoJaGFzaWwgOj0gbWFrZShbXVBhc2FuZ2FuS2x1YiwgMCwgbGVuKGsucG9pbikpCglmb3IgXywga2x1YiA6PSByYW5nZSBrLnVydXRhbiB7CgkJaGFzaWwgPSBhcHBlbmQoaGFzaWwsIFBhc2FuZ2FuS2x1YntLbHViOiBrbHViLCBQb2luOiBrLnBvaW5ba2x1Yl19KQoJfQoKCXNvcnQuU2xpY2VTdGFibGUoaGFzaWwsIGZ1bmMoaSwgaiBpbnQpIGJvb2wgewoJCXJldHVybiBoYXNpbFtpXS5Qb2luID4gaGFzaWxbal0uUG9pbgoJfSkKCglyZXR1cm4gaGFzaWwKfQoKZnVuYyAoayAqS2xhc2VtZW4pIEFtYmlsUGVyaW5na2F0KG5vbW9yUGVyaW5na2F0IGludCkgc3RyaW5nIHsKCWtsYXNlbWVuIDo9IGsuQ2V0YWtLbGFzZW1lbigpCglpZiBub21vclBlcmluZ2thdCA8IDEgfHwgbm9tb3JQZXJpbmdrYXQgPiBsZW4oa2xhc2VtZW4pIHsKCQlyZXR1cm4gIiIKCX0KCXJldHVybiBrbGFzZW1lbltub21vclBlcmluZ2thdC0xXS5LbHViCn0KCmZ1bmMgbWFpbigpIHsKCXJlYWRlciA6PSBidWZpby5OZXdSZWFkZXIob3MuU3RkaW4pCgliYWNhIDo9IGZ1bmMoKSBzdHJpbmcgewoJCXMsIF8gOj0gcmVhZGVyLlJlYWRTdHJpbmcoJ1xuJykKCQlyZXR1cm4gc3RyaW5ncy5UcmltU3BhY2UocykKCX0KCgluLCBfIDo9IHN0cmNvbnYuQXRvaShiYWNhKCkpCgl2YXIgbmFtYUtsdWIgW11zdHJpbmcKCWZvciBsZW4obmFtYUtsdWIpIDwgbiB7CgkJYmFyaXMgOj0gYmFjYSgpCgkJbmFtYUtsdWIgPSBhcHBlbmQobmFtYUtsdWIsIHN0cmluZ3MuRmllbGRzKGJhcmlzKS4uLikKCX0KCglrbGFzZW1lbiA6PSBOZXdLbGFzZW1lbihuYW1hS2x1YikKCgltLCBfIDo9IHN0cmNvbnYuQXRvaShiYWNhKCkpCglmb3IgaSA6PSAwOyBpIDwgbTsgaSsrIHsKCQliYXJpcyA6PSBzdHJpbmdzLkZpZWxkcyhiYWNhKCkpCgkJa2xhc2VtZW4uQ2F0YXRQZXJtYWluYW4oYmFyaXNbMF0sIGJhcmlzWzFdLCBiYXJpc1syXSkKCX0KCglmbXQuUHJpbnRsbigiS2xhc2VtZW46IikKCWZvciBpLCBwYXNhbmdhbiA6PSByYW5nZSBrbGFzZW1lbi5DZXRha0tsYXNlbWVuKCkgewoJCWZtdC5QcmludGYoIiVkLiAlcyA9PiAlZCBwb2luXG4iLCBpKzEsIHBhc2FuZ2FuLktsdWIsIHBhc2FuZ2FuLlBvaW4pCgl9CgoJcSwgXyA6PSBzdHJjb252LkF0b2koYmFjYSgpKQoJZm9yIGkgOj0gMDsgaSA8IHE7IGkrKyB7CgkJbm9tb3IsIF8gOj0gc3RyY29udi5BdG9pKGJhY2EoKSkKCQlmbXQuUHJpbnRmKCJQZXJpbmdrYXQga2UtJWQ6ICVzXG4iLCBub21vciwga2xhc2VtZW4uQW1iaWxQZXJpbmdrYXQobm9tb3IpKQoJfQp9