Problem:
Score : 100 points

Problem Statement

We conducted a survey on newspaper subscriptions.
More specifically, we asked each of the N respondents the following two questions:

Question 1: Are you subscribing to Newspaper X?

Question 2: Are you subscribing to Newspaper Y?

As the result, A respondents answered "yes" to Question 1, and B respondents answered "yes" to Question 2.

What are the maximum possible number and the minimum possible number of respondents subscribing to both newspapers X and Y?

Write a program to answer this question.

Constraints

1 \leq N \leq 100

0 \leq A \leq N

0 \leq B \leq N

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N A B

Output

Print the maximum possible number and the minimum possible number of respondents subscribing to both newspapers, in this order, with a space in between.

Sample Input 1

10 3 5

Sample Output 1

3 0

In this sample, out of the 10 respondents, 3 answered they are subscribing to Newspaper X, and 5 answered they are subscribing to Newspaper Y.

Here, the number of respondents subscribing to both newspapers is at most 3 and at least 0.

Sample Input 2

10 7 5

Sample Output 2

5 2

In this sample, out of the 10 respondents, 7 answered they are subscribing to Newspaper X, and 5 answered they are subscribing to Newspaper Y.

Here, the number of respondents subscribing to both newspapers is at most 5 and at least 2.

Sample Input 3

100 100 100

Sample Output 3

100 100

Solution in Java8 (OpenJDK 1.8.0) (judge verdict: Runtime Error)

import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;

public class Main {

	static TreeMap<Integer, We> w = new TreeMap<>();
	static TreeMap<Integer, List<Integer>> idx = new TreeMap<>();

	public static void main(String[] args) throws IOException {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int m = in.nextInt();
		Set<Integer> from = new TreeSet<>();
		Set<Integer> to = new TreeSet<>();
		for (int i = 0; i < n - 1 + m; i++) {
			int a = in.nextInt();
			int b = in.nextInt();

			from.add(a);
			to.add(b);

			List<Integer> list = idx.get(a);
			if (list == null) {
				list = new ArrayList<>();
				idx.put(a, list);
			}
			list.add(b);
		}

		from.removeAll(to);
		Integer root = from.iterator().next();
		hoge(root, 0, 0);

		BufferedOutputStream out = new BufferedOutputStream(System.out);
		OutputStreamWriter wri = new OutputStreamWriter(out);

		for (Map.Entry<Integer, We> e : w.entrySet()) {
			wri.write(String.valueOf(e.getValue().val) + "\n");
		}

		wri.flush();
		in.close();
	}

	public static void hoge(int root, int parent, int level) {
		w.merge(root, new We(level, parent), (old, v) -> {
			if (v.level > old.level) {
				return v;
			} else {
				return old;
			}
		});
		level++;
		List<Integer> list = idx.get(root);
		if (list != null) {
			for (Integer i : list) {
				hoge(i, root, level);
			}
		}
	}

}

class We {
	int level;
	int val;
	public We(int level, int val) {
		this.level = level;
		this.val = val;
	}
}