import sys
import datetime
INF = 10**9
def is_longer_a_month(date1, date2):
# date format is YYYY-MM-DD
datetime1 = datetime.date(date1[0], date1[1], date1[2])
datetime2 = datetime.date(date2[0], date2[1], date2[2])
return (datetime2 - datetime1 >= datetime.timedelta(days=30))
with sys.stdin as fi, sys.stdout as fo:
record = [line.strip() for line in fi.readlines()] # bỏ \n ở cuối xâu
# chuyển data trong record về dạng tuple
# (số_điện_thoại, activation_year, activation_month, activation_day, deactivation_year, deactivation_month, deactivation_day)
for i in range(len(record)):
data = record[i].split(',')
new_tuple = [data[0]] + list(map(int, data[1].split('-')))
if data[2] == '':
new_tuple.extend([INF, INF, INF])
else:
new_tuple.extend(list(map(int, data[2].split('-'))))
record[i] = tuple(new_tuple)
record.sort() # chỉ cần sort lại đơn giản
last_deactivation_date = (1, 1, 0)
list_last_activation_date = []
for line in record:
if len(list_last_activation_date) > 0 and line[0] == list_last_activation_date[-1][0]:
# nếu số điện thoại này đã nằm trong list,
# tức là đã có 1 thông tin về 1 ngày activation nào đó
if is_longer_a_month(last_deactivation_date, (line[1], line[2], line[3])):
# nếu đã ngày ngừng sử dụng trước cách ngày activation này hơn 1 tháng,
# tức là số đã được chuyển cho người khác
list_last_activation_date[-1][1] = (line[1], line[2], line[3])
# nếu không thì không làm gì tiếp cả, số vẫn chưa bị tái sử dụng
else: # nếu số này chưa xuất hiện
list_last_activation_date.append([line[0], (line[1], line[2], line[3])])
last_deactivation_date = (line[4], line[5], line[6])
for u in list_last_activation_date:
print("{0},{1:0>4}-{2:0>2}-{3:0>2}".format(u[0], u[1][0], u[1][1], u[1][2]))
aW1wb3J0IHN5cwppbXBvcnQgZGF0ZXRpbWUKCklORiA9IDEwKio5CgoKZGVmIGlzX2xvbmdlcl9hX21vbnRoKGRhdGUxLCBkYXRlMik6CgkjIGRhdGUgZm9ybWF0IGlzIFlZWVktTU0tREQKCWRhdGV0aW1lMSA9IGRhdGV0aW1lLmRhdGUoZGF0ZTFbMF0sIGRhdGUxWzFdLCBkYXRlMVsyXSkKCWRhdGV0aW1lMiA9IGRhdGV0aW1lLmRhdGUoZGF0ZTJbMF0sIGRhdGUyWzFdLCBkYXRlMlsyXSkKCXJldHVybiAoZGF0ZXRpbWUyIC0gZGF0ZXRpbWUxID49IGRhdGV0aW1lLnRpbWVkZWx0YShkYXlzPTMwKSkKCgp3aXRoIHN5cy5zdGRpbiBhcyBmaSwgc3lzLnN0ZG91dCBhcyBmbzoKCXJlY29yZCA9IFtsaW5lLnN0cmlwKCkgZm9yIGxpbmUgaW4gZmkucmVhZGxpbmVzKCldICMgYuG7jyBcbiDhu58gY3Xhu5FpIHjDonUKCgkjIGNodXnhu4NuIGRhdGEgdHJvbmcgcmVjb3JkIHbhu4EgZOG6oW5nIHR1cGxlCgkjIChz4buRX8SRaeG7h25fdGhv4bqhaSwgYWN0aXZhdGlvbl95ZWFyLCBhY3RpdmF0aW9uX21vbnRoLCBhY3RpdmF0aW9uX2RheSwgZGVhY3RpdmF0aW9uX3llYXIsIGRlYWN0aXZhdGlvbl9tb250aCwgZGVhY3RpdmF0aW9uX2RheSkKCWZvciBpIGluIHJhbmdlKGxlbihyZWNvcmQpKToKCQlkYXRhID0gcmVjb3JkW2ldLnNwbGl0KCcsJykKCQluZXdfdHVwbGUgPSBbZGF0YVswXV0gKyBsaXN0KG1hcChpbnQsIGRhdGFbMV0uc3BsaXQoJy0nKSkpCgkJaWYgZGF0YVsyXSA9PSAnJzoKCQkJbmV3X3R1cGxlLmV4dGVuZChbSU5GLCBJTkYsIElORl0pCgkJZWxzZToKCQkJbmV3X3R1cGxlLmV4dGVuZChsaXN0KG1hcChpbnQsIGRhdGFbMl0uc3BsaXQoJy0nKSkpKQoKCQlyZWNvcmRbaV0gPSB0dXBsZShuZXdfdHVwbGUpCgkKCXJlY29yZC5zb3J0KCkgICMgY2jhu4kgY+G6p24gc29ydCBs4bqhaSDEkcahbiBnaeG6o24KCglsYXN0X2RlYWN0aXZhdGlvbl9kYXRlID0gKDEsIDEsIDApCglsaXN0X2xhc3RfYWN0aXZhdGlvbl9kYXRlID0gW10KCglmb3IgbGluZSBpbiByZWNvcmQ6CgkJaWYgbGVuKGxpc3RfbGFzdF9hY3RpdmF0aW9uX2RhdGUpID4gMCBhbmQgbGluZVswXSA9PSBsaXN0X2xhc3RfYWN0aXZhdGlvbl9kYXRlWy0xXVswXToKCQkJIyBu4bq/dSBz4buRIMSRaeG7h24gdGhv4bqhaSBuw6B5IMSRw6MgbuG6sW0gdHJvbmcgbGlzdCwKCQkJIyB04bupYyBsw6AgxJHDoyBjw7MgMSB0aMO0bmcgdGluIHbhu4EgMSBuZ8OgeSBhY3RpdmF0aW9uIG7DoG8gxJHDswoJCQlpZiBpc19sb25nZXJfYV9tb250aChsYXN0X2RlYWN0aXZhdGlvbl9kYXRlLCAobGluZVsxXSwgbGluZVsyXSwgbGluZVszXSkpOgoJCQkJIyBu4bq/dSDEkcOjIG5nw6B5IG5n4burbmcgc+G7rSBk4bulbmcgdHLGsOG7m2MgY8OhY2ggbmfDoHkgYWN0aXZhdGlvbiBuw6B5IGjGoW4gMSB0aMOhbmcsCgkJCQkjIHThu6ljIGzDoCBz4buRIMSRw6MgxJHGsOG7o2MgY2h1eeG7g24gY2hvIG5nxrDhu51pIGtow6FjCgkJCQlsaXN0X2xhc3RfYWN0aXZhdGlvbl9kYXRlWy0xXVsxXSA9IChsaW5lWzFdLCBsaW5lWzJdLCBsaW5lWzNdKQoJCQkjIG7hur91IGtow7RuZyB0aMOsIGtow7RuZyBsw6BtIGfDrCB0aeG6v3AgY+G6oywgc+G7kSB24bqrbiBjaMawYSBi4buLIHTDoWkgc+G7rSBk4bulbmcKCQllbHNlOiAjIG7hur91IHPhu5EgbsOgeSBjaMawYSB4deG6pXQgaGnhu4duCgkJCWxpc3RfbGFzdF9hY3RpdmF0aW9uX2RhdGUuYXBwZW5kKFtsaW5lWzBdLCAobGluZVsxXSwgbGluZVsyXSwgbGluZVszXSldKQoJCQoJCWxhc3RfZGVhY3RpdmF0aW9uX2RhdGUgPSAobGluZVs0XSwgbGluZVs1XSwgbGluZVs2XSkKCglmb3IgdSBpbiBsaXN0X2xhc3RfYWN0aXZhdGlvbl9kYXRlOgoJCXByaW50KCJ7MH0sezE6MD40fS17MjowPjJ9LXszOjA+Mn0iLmZvcm1hdCh1WzBdLCB1WzFdWzBdLCB1WzFdWzFdLCB1WzFdWzJdKSkK
MDk4NzAwMDAwMSwyMDE2LTAzLTAxLDIwMTYtMDUtMDEKMDk4NzAwMDAwMiwyMDE2LTAyLTAxLDIwMTYtMDMtMDEKMDk4NzAwMDAwMSwyMDE2LTAxLTAxLDIwMTYtMDMtMDEKMDk4NzAwMDAwMSwyMDE2LTEyLTAxLAowOTg3MDAwMDAyLDIwMTYtMDMtMDEsMjAxNi0wNS0wMQowOTg3MDAwMDAzLDIwMTYtMDEtMDEsMjAxNi0wMS0xMAowOTg3MDAwMDAxLDIwMTYtMDktMDEsMjAxNi0xMi0wMQowOTg3MDAwMDAyLDIwMTYtMDUtMDEsCjA5ODcwMDAwMDEsMjAxNi0wNi0wMSwyMDE2LTA5LTAx
0987000001,2016-03-01,2016-05-01
0987000002,2016-02-01,2016-03-01
0987000001,2016-01-01,2016-03-01
0987000001,2016-12-01,
0987000002,2016-03-01,2016-05-01
0987000003,2016-01-01,2016-01-10
0987000001,2016-09-01,2016-12-01
0987000002,2016-05-01,
0987000001,2016-06-01,2016-09-01