#include <iostream>
#include <vector>
#include <string>
#include <map>
// Struktur data untuk Pendonor
struct Donor {
int desa;
std::string golongan;
int volume;
};
void hitung_pendonor_per_desa() {
// Optimasi I/O
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
int N, M;
// Baris 1: Membaca N (Jumlah DDS, maks 1000)
if (!(std::cin >> N)) return;
// Baris 2: Membaca M (Jumlah Desa, maks 10)
if (!(std::cin >> M)) return;
// Map untuk menghitung jumlah pendonor per desa.
// Key: Kode Desa (int), Value: Jumlah Pendonor (int)
std::map<int, int> jumlah_per_desa;
// N baris berikutnya: Membaca data setiap pendonor
for (int i = 0; i < N; ++i) {
Donor d;
// Membaca Kode Desa, Golongan Darah, Volume Darah
if (!(std::cin >> d.desa >> d.golongan >> d.volume)) break;
// Pengecekan Batas dan Validasi Data
// Kode Desa harus antara 1 dan M
// Volume Darah harus antara 0 dan 500
if (d.desa >= 1 && d.desa <= M && d.volume >= 0 && d.volume <= 500) {
// Jika data valid, tambahkan hitungan untuk desa tersebut
jumlah_per_desa[d.desa]++;
}
// Data yang tidak valid akan diabaikan
}
// --- Menampilkan Hasil Keluaran Sesuai Permintaan ---
bool pertama = true;
for (int i = 1; i <= M; ++i) {
// Ambil jumlah pendonor. Gunakan 0 jika desa tidak ada di map (tidak ada pendonor)
int hitungan = jumlah_per_desa.count(i) ? jumlah_per_desa[i] : 0;
// Cek apakah output perlu dipisahkan dengan spasi
if (!pertama) {
std::cout << " ";
}
// Cetak format: Desa KODE:JUMLAH
std::cout << "Desa " << i << ":" << hitungan;
pertama = false;
}
std::cout << std::endl; // Pindah baris di akhir
}
int main() {
std::cout << "Masukkan N, M, diikuti N baris data (KodeDesa GolonganDarah Volume):\n";
// Contoh Input: 8 3 1 A 250 2 O 300 1 B 500 3 AB 400 1 O 200 2 A 350 3 B 450 3 O 200
hitung_pendonor_per_desa();
return 0;
}