import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Scanner; import java.util.Set; public class CoveringSegments { public static class Segment implements Comparable { int start, end; Segment(int start, int end) { this.start = start; this.end = end; } public int compareTo(Segment that) { if (this.start > that.start) return 1; if (this.start == that.start) { if (this.end > that.end) return 1; else if (this.end == that.end) { return 0; } else return -1; } return -1; } @Override public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof Segment)) { return false; } Segment s = (Segment) o; return start == s.start && end == s.end; } @Override public int hashCode() { return Objects.hash(start, end); } } public static void main(String[] args) { // Scanner scanner = new Scanner(System.in); // int n = scanner.nextInt(); // Set segments = new HashSet(); // for (int i = 0; i < n; i++) { // int start, end; // start = scanner.nextInt(); // end = scanner.nextInt(); // segments.add(new Segment(start, end)); // } // Segment[] s = segments.stream().toArray(Segment[]::new); // Arrays.sort(s); // int[] points = getOptimalPoints(s); // System.out.println(points.length); // for (int point : points) { // System.out.print(point + " "); // } Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); Segment[] segments = new Segment[n]; for (int i = 0; i < n; i++) { int start, end; start = scanner.nextInt(); end = scanner.nextInt(); segments[i] = new Segment(start, end); } Set s = new HashSet(Arrays.asList(segments)); Segment[] newArray = s.stream().toArray(Segment[]::new); Arrays.sort(newArray); int[] points = getOptimalPoints(newArray); System.out.println(points.length); for (int point : points) { System.out.print(point + " "); } } public static int[] getOptimalPoints(Segment[] s) { int index = 0; List points = new ArrayList(); while (index < s.length) { points.add(s[index].end); index = index + 1; while (index < s.length && s[index].start <= points.get(points.size() - 1).intValue()) { if (s[index].end < points.get(points.size() - 1).intValue()) points.set(points.size() - 1, s[index].end); index = index + 1; } } return points.stream().mapToInt(i -> i).toArray(); } }