Решение
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class Main {
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
// Чтение количества людей
int N = Integer.parseInt(reader.readLine().trim());
List<Event> events = new ArrayList<>();
// Обработка данных каждого человека
for (int i = 0; i < N; i++) {
String[] parts = reader.readLine().split(" ");
int dStart = Integer.parseInt(parts[0]);
int mStart = Integer.parseInt(parts[1]);
int yStart = Integer.parseInt(parts[2]);
int dEnd = Integer.parseInt(parts[3]);
int mEnd = Integer.parseInt(parts[4]);
int yEnd = Integer.parseInt(parts[5]);
// Создание дат рождения и смерти
LocalDate birthDate = LocalDate.of(yStart, mStart, dStart);
LocalDate deathDate = LocalDate.of(yEnd, mEnd, dEnd);
LocalDate startDate = birthDate.plusYears(18); // Дата 18-летия
LocalDate updateStart = birthDate.plusYears(80); // Дата 80-летия
LocalDate endDate = updateStart.isBefore(deathDate) ? updateStart : deathDate; // Конец периода
// Добавление событий, если период валиден
if (startDate.isBefore(endDate)) {
events.add(new Event(startDate, 1, i + 1));
events.add(new Event(endDate, -1, i + 1));
}
}
// Сортировка событий по дате и типу
events.sort((a, b) -> {
int dateCompare = a.date.compareTo(b.date);
if (dateCompare != 0) {
return dateCompare;
}
return Integer.compare(a.type, b.type); // Начало (1) перед концом (-1)
});
// Обработка событий и поиск максимальных множеств
Set<Integer> currentGroup = new HashSet<>();
List<String> result = new ArrayList<>();
for (int i = 0; i < events.size(); i++) {
Event event = events.get(i);
if (event.type == 1) {
// Добавление человека в группу при начале периода
currentGroup.add(event.person);
} else if (event.type == -1 && !currentGroup.isEmpty()) {
// Проверка максимального множества при завершении периода
if (i > 0 && events.get(i - 1).type == 1) {
List<Integer> groupList = new ArrayList<>(currentGroup);
groupList.sort(Integer::compareTo);
result.add(groupList.stream().map(String::valueOf).collect(Collectors.joining(" ")));
}
currentGroup.remove(event.person);
}
}
// Вывод результата
if (result.isEmpty()) {
writer.write("0");
} else {
writer.write(String.join("\\n", result));
}
writer.flush();
reader.close();
writer.close();
}
// Класс для представления события
static class Event {
LocalDate date;
int type; // 1 для начала, -1 для конца
int person;
Event(LocalDate date, int type, int person) {
this.date = date;
this.type = type;
this.person = person;
}
}
}