import java.io.*;
import java.util.*;
class Makanan {
private int harga;
public Makanan
(int harga,
String tipe
){ this.harga=harga;
this.tipe=tipe;
}
return this.tipe;
}
int getHarga(){
return this.harga;
}
}
class Pelanggan {
private int id;
private String statusKesehatan
; private int uang;
private Queue<Makanan> makananDiPesan;
private Queue<Koki> dilayaniKoki;
private int tagihan;
public Pelanggan
(int id,
int uang,
String statusKesehatan
){ this.statusKesehatan=statusKesehatan;
this.uang=uang;
makananDiPesan = new LinkedList<Makanan>();
dilayaniKoki = new LinkedList<Koki>();
tagihan=0;
this.id=id;
}
int getId(){
return this.id;
}
return this.statusKesehatan;
}
void tambahPesanan (Makanan makanan){
makananDiPesan.add(makanan);
tagihan+=makanan.getHarga();
}
int getTagihan(){
return this.tagihan;
}
Makanan getMakanan() {
return this.makananDiPesan.poll();
}
int getUang(){
return this.uang;
}
Koki getKoki() {
this.makananDiPesan.poll();
return this.dilayaniKoki.poll();
}
void tambahKoki (Koki koki){
this.dilayaniKoki.add(koki);
}
}
class Koki {
private int id;
private int banyakMelayani=0;
public Koki
(int id,
String spesialisasi,
int banyakMelayani
){ this.id=id;
this.spesialisasi=spesialisasi;
this.banyakMelayani=banyakMelayani;
}
int getId(){
return this.id;
}
return this.spesialisasi;
}
int getBanyakMelayani(){
return this.banyakMelayani;
}
void tambahPelayanan(){
this.banyakMelayani++;
}
}
class comparator implements Comparator<Koki>{
@Override
public int compare(Koki a, Koki b){
// cek pada banyak melayani
if (a.getBanyakMelayani() < b.getBanyakMelayani()) return -1;
else if (a.getBanyakMelayani() == b.getBanyakMelayani()){
// cek pada spesialisasi (sort secara descending)
if (a.getSpesialisasi().compareTo(b.getSpesialisasi())>0){
return -1;
} else if (a.getSpesialisasi().compareTo(b.getSpesialisasi()) == 0){
// cek pada id
if (a.getId() < b.getId()) return -1;
}
}
return 1;
}
}
class TP1 {
private static InputReader in;
private static ArrayList<Makanan> daftarMakanan = new ArrayList<Makanan>();; // index arraylist == id/index makanan-1
private static PriorityQueue<Koki> daftarKokiA = new PriorityQueue<Koki>(new comparator());
private static PriorityQueue<Koki> daftarKokiG = new PriorityQueue<Koki>(new comparator());
private static PriorityQueue<Koki> daftarKokiS = new PriorityQueue<Koki>(new comparator());
private static HashMap
<Integer, Pelanggan
> daftarPelanggan
; // id, pelanggan, berlaku selamanya private static ArrayList<Integer> daftarBlacklist; // isinya id pelanggan dan berlaku selamanya
private static ArrayList<Pelanggan> restoran; // berlaku pada hari itu
private static Queue<Pelanggan> urutanPelanggan; // berlaku pada hari itu
private static HashMap
<String, Integer
> costs
; private static HashMap
<String, Boolean
> foundPackage
;
public static void main
(String[] args
) { in = new InputReader(inputStream);
// Input keperluan makanan lalu buat objek Makanan dan tambahkan ke daftarMakanan
int banyakMakanan = in.nextInt();
for (int i=0;i<banyakMakanan;i++) { // 50000
int harga = in.nextInt();
Makanan makanan = new Makanan(harga, tipe);
daftarMakanan.add(makanan);
}
// Input keperluan koki lalu buat objek Koki dan tambahkan ke daftarKoki
int banyakKoki = in.nextInt();
for (int i=0;i<banyakKoki;i++) { // 1000000
String spesialisasi
= in.
next(); if (spesialisasi.equals("A")){
Koki koki= new Koki(i+1,"A",0);
daftarKokiA.add(koki);
} else if (spesialisasi.equals("G")){
Koki koki= new Koki(i+1,"G",0);
daftarKokiG.add(koki);
} else {
Koki koki= new Koki(i+1,"S",0);
daftarKokiS.add(koki);
}
}
int banyakPelanggan = in.nextInt();
daftarBlacklist = new ArrayList<Integer>();
daftarPelanggan
= new HashMap
<Integer, Pelanggan
>(banyakPelanggan
); int banyakKursi = in.nextInt();
int jumlahHari = in.nextInt();
for (int hariKe=1;hariKe<=jumlahHari;hariKe++){ // 5
int jumlahPelanggan = in.nextInt();
int pelangganDuduk = 0;
int penghitungStatus = 0; // jika positif maka lebih banyak pelanggan positif dan sebaliknya
int[] memo = new int[jumlahPelanggan]; // menyimpan status pelanggan sebelum nya
restoran = new ArrayList<Pelanggan>();
urutanPelanggan = new LinkedList<Pelanggan>();
for (int pelangganKe=0;pelangganKe<jumlahPelanggan;pelangganKe++) { // 100000
// Input keperluan Pelanggan
int id = in.nextInt();
int uang = in.nextInt();
int range, hasil;
// Lakukan advance scanning
if (status.equals("?")){
range = in.nextInt();
if (range==pelangganKe) hasil=penghitungStatus;
else hasil = penghitungStatus-memo[pelangganKe - range - 1];
if (hasil>0) status="+";
else status="-";
// for (int i = pelangganKe-range; i<=pelangganKe-1;i++){ // Hitung pelanggan positif dan negatif
// if (restoran.get(i).getStatus().equals("+")) pos++;
// else neg++;
// }
// if (neg<pos) status="+";
// else status="-";
}
if (status.equals("+")) penghitungStatus++;
else penghitungStatus--;
memo[pelangganKe]=penghitungStatus;
// Buat Objek Pelanggan lalu tambahkan ke daftarPelanggan dan restoran. Apabila sudah ada maka update
Pelanggan pelanggan = new Pelanggan(id, uang, status);
if (daftarPelanggan.containsKey(id)) daftarPelanggan.replace(id, pelanggan);
daftarPelanggan.put(id, pelanggan);
restoran.add(pelanggan);
if (status.equals("-") && !daftarBlacklist.contains(id)){ // Diperbolehkan masuk dan tidak ada di daftar blacklist
if (pelangganDuduk < banyakKursi) { // Cek keadaan restoran
pelangganDuduk++;
out.print("1 ");
} else {
if (pelangganKe==jumlahPelanggan-1) out.print("2");
else out.print("2 ");
}
} else if (status.equals("+") && !daftarBlacklist.contains(id)){ // Pelanggan berstatus positif
out.print("0 ");
} else { // Pelanggan di blacklist
out.print("3 ");
}
}
out.println();
int jumlahPelayanan = in.nextInt();
for (int layananKe=0;layananKe<jumlahPelayanan;layananKe++){ // 200000
if (perintah.equals("P")){
int idPelanggan = in.nextInt();
int indexMakanan = in.nextInt();
Koki koki = null;
// Mencari koki sesuai persyaratan
if (daftarMakanan.get(indexMakanan-1).getTipe().equals("A")){
koki=daftarKokiA.peek();
} else if (daftarMakanan.get(indexMakanan-1).getTipe().equals("G")){
koki=daftarKokiG.peek();
} else {
koki=daftarKokiS.peek();
}
Pelanggan pelanggan = daftarPelanggan.get(idPelanggan);
pelanggan.tambahPesanan(daftarMakanan.get(indexMakanan-1));
pelanggan.tambahKoki(koki);
urutanPelanggan.add(pelanggan);
out.println(koki.getId());
// Print id koki yg mengambil pesanan
} else if (perintah.equals("L")){
Pelanggan pelanggan = urutanPelanggan.poll();
Koki koki = pelanggan.getKoki();
// Update koki pada banyak pelayanan
if (daftarKokiA.contains(koki)){
daftarKokiA.remove(koki);
koki.tambahPelayanan();
daftarKokiA.add(koki);
} else if (daftarKokiG.contains(koki)){
daftarKokiG.remove(koki);
koki.tambahPelayanan();
daftarKokiG.add(koki);
} else {
daftarKokiS.remove(koki);
koki.tambahPelayanan();
daftarKokiS.add(koki);
}
out.println(pelanggan.getId());
// Print id pelanggan yg memesan
} else if (perintah.equals("B")){
int idPelanggan = in.nextInt();
Pelanggan pelanggan = daftarPelanggan.get(idPelanggan);
if (pelanggan.getUang() < pelanggan.getTagihan()){ // Pelanggan tidak mampu membayar
daftarBlacklist.add(pelanggan.getId());
out.println(0);
} else{
out.println(1);
}
// Print mencukupi/tidak
} else if (perintah.equals("C")){
int q = in.nextInt();
PriorityQueue<Koki> urutanKoki = new PriorityQueue<Koki>(new comparator()); // Berisi semua tipe koki
urutanKoki.addAll(daftarKokiS);
urutanKoki.addAll(daftarKokiG);
urutanKoki.addAll(daftarKokiA);
for (int i=0;i<q;i++) { // 500000
if (i<q-1) out.print(urutanKoki.poll().getId() + " ");
else out.println(urutanKoki.poll().getId());
}
// Print id koki berada pada urutan ke q teratas
} else if (perintah.equals("D")){ // 2500
int costA = in.nextInt();
int costG = in.nextInt();
int costS = in.nextInt();
costs
= new HashMap
<String, Integer
>(); costs.put("A", costA);
costs.put("G", costG);
costs.put("S", costS);
foundPackage
= new HashMap
<String , Boolean
>(); foundPackage.put("A", false);
foundPackage.put("G", false);
foundPackage.put("S", false);
out.println(paketTermurah(0));
// harga minimum utk dpt membeli seluruh daftarMakanan makanan
}
}
}
out.close();
}
public static int paketTermurah(int start){
if (start==daftarMakanan.size()) return 0;
for (int i=start; i<daftarMakanan.size(); i++){ // 1000
int temp=0;
if (daftarMakanan.get(start).getTipe().equals(daftarMakanan.get(i).getTipe())){
if (i==start) {
temp = daftarMakanan.get(start).getHarga() + paketTermurah(i+1);
} else if (daftarMakanan.get(start).getTipe().equals("A")) {
if (foundPackage.get("A")) continue;
else {
foundPackage.replace("A", true);
temp = costs.get("A")*(i-start+1) + paketTermurah(i+1);
foundPackage.replace("A",false);
}
} else if (daftarMakanan.get(start).getTipe().equals("G")) {
if (foundPackage.get("G")) continue;
else {
foundPackage.replace("G", true);
temp = costs.get("G")*(i-start+1) + paketTermurah(i+1);
foundPackage.replace("G",false);
}
} else {
if (foundPackage.get("S")) continue;
else {
foundPackage.replace("S", true);
temp = costs.get("S")*(i-start+1) + paketTermurah(i+1);
foundPackage.replace("S",false);
}
}
ans
= Math.
min(temp, ans
); }
}
return ans;
}
// taken from https://c...content-available-to-author-only...s.com/submissions/Petr
// together with PrintWriter, these input-output (IO) is much faster than the
// usual Scanner(System.in) and System.out
// please use these classes to avoid your fast algorithm gets Time Limit
// Exceeded caused by slow input-output (IO)
static class InputReader {
}
while (tokenizer == null || !tokenizer.hasMoreElements()) {
try {
}
}
return tokenizer.nextToken();
}
public int nextInt() {
}
}
}