/* package whatever; // don't place package name! */

import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Stream;
import java.util.Random;

import static java.util.Collections.emptyList;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Stream.generate;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static class MaxAndMinDto {
        private final List<Integer> max;
        private final List<Integer> min;
        
        private MaxAndMinDto(List<Integer> max, List<Integer> min) {
        	this.max = max;
        	this.min = min;
        }
        
        public List<Integer> getMax() {
        	return max;
        }
        
        public List<Integer> getMin() {
        	return min;
        }
        
        @Override
        public String toString() {
            return "MaxAndMinDto{max=" + max + ", min=" + min + '}';
        }
    }
	    
	public static Function<Stream<Integer>, MaxAndMinDto> findMaxAndMinWithLimit(int limit) {
        Comparator<Integer> comparator = Integer::compareTo;
        return s -> s
                .map(Collections::singletonList)
                .map(list -> new MaxAndMinDto(list, list))
                .reduce((left, right) -> new MaxAndMinDto(
                        Stream.concat(left.getMax().stream(), right.getMax().stream())
                                .sorted(comparator.reversed())
                                .distinct()
                                .limit(limit)
                                .collect(toList()),
                        Stream.concat(left.getMin().stream(), right.getMin().stream())
                                .sorted(comparator)
                                .distinct()
                                .limit(limit)
                                .collect(toList())
                ))
                .orElseGet(() -> new MaxAndMinDto(emptyList(), emptyList()));
    }

	public static void main (String[] args) throws java.lang.Exception
	{
	        int limit = 5;
	        Random random = new Random();
                    Stream<Integer> values = generate(random::nextInt).limit(5000000);
	        MaxAndMinDto maxAndMinDto = findMaxAndMinWithLimit(limit).apply(values);
	        System.out.println(maxAndMinDto);
	}
}