There are n benches in the Berland Central park. It is known that a_i people are currently sitting on the i-th bench. Another m people are coming to the park and each of them is going to have a seat on some bench out of n available.

Let k be the maximum number of people sitting on one bench after additional m people came to the park. Calculate the minimum possible k and the maximum possible k.

Nobody leaves the taken seat during the whole process.

Input

The first line contains a single integer n (1 ≤ n ≤ 100) — the number of benches in the park.

The second line contains a single integer m (1 ≤ m ≤ 10 000) — the number of people additionally coming to the park.

Each of the next n lines contains a single integer a_i (1 ≤ a_i ≤ 100) — the initial number of people on the i-th bench.

Output

Print the minimum possible k and the maximum possible k, where k is the maximum number of people sitting on one bench after additional m people came to the park.

Examples

Input

4
6
1
1
1
1


Output

3 7


Input

1
10
5


Output

15 15


Input

3
6
1
6
5


Output

6 12


Input

3
7
1
6
5


Output

7 13

Note

In the first example, each of four benches is occupied by a single person. The minimum k is 3. For example, it is possible to achieve if two newcomers occupy the first bench, one occupies the second bench, one occupies the third bench, and two remaining — the fourth bench. The maximum k is 7. That requires all six new people to occupy the same bench.

The second example has its minimum k equal to 15 and maximum k equal to 15, as there is just a single bench in the park and all 10 people will occupy it.
import java.io.*;
import java.math.*;
import java.util.*;

public class A{
  static final int mod = 1000000007;

  static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

  static void parr(int []arr) throws Exception{
    for(int i : arr) System.out.print(i+" ");
    System.out.println();
  }
  static void parr(long []arr) throws Exception{
    for(long i : arr) System.out.print(i+" ");
    System.out.println();
  }
  static void parr(double []arr) throws Exception{
    for(double i : arr) System.out.print(i+" ");
    System.out.println();
  }
  static void parr(float []arr) throws Exception{
    for(float i : arr) System.out.print(i+" ");
    System.out.println();
  }

  static int inpi() throws Exception{
    return (int)(Integer.parseInt(br.readLine()));
  }
  static long inpl() throws Exception{
    return (long)Long.parseLong(br.readLine());
  }
  static double inpd() throws Exception{
    return (double)Double.parseDouble(br.readLine());
  }
  static float inpf() throws Exception{
    return (float)Float.parseFloat(br.readLine());
  }

  static int[] inpai() throws Exception{
    String ar[] = br.readLine().split(" ");
    int n = ar.length;
    int arr[] = new int[n];
    int k=0;
    for(String i : ar) arr[k++] = (int)(Integer.parseInt(i));
    return arr;
  }

  static double[] inpad() throws Exception{
    String ar[] = br.readLine().split(" ");
    int n = ar.length;
    double arr[] = new double[n];
    int k=0;
    for(String i : ar) arr[k++] = (double)(Double.parseDouble(i));
    return arr;
  }

  static float[] inpaf() throws Exception{
    String ar[] = br.readLine().split(" ");
          int n = ar.length;
    float arr[] = new float[n];
    int k=0;
    for(String i : ar) arr[k++] = (float)(Float.parseFloat(i));
    return arr;
  }

  static long[] inpal() throws Exception{
    String ar[] = br.readLine().split(" ");
          int n = ar.length;
    long arr[] = new long[n];
    int k=0;
    for(String i : ar) arr[k++] = (long)(Long.parseLong(i));
    return arr;
  }
///////

///////////
static boolean isPrime(int num){
  if(num%2==0) return false;
  int sqrt = (int)Math.sqrt(num);

  for(int i=3;i<=sqrt;i+=2){
    if(num%i==0) return false;
  }

  return true;
}
/////////////
static int gcd (int a,int b){
if(b==0) return a;
return gcd(b,a%b);
}
//////
/*
static class sort implements Comparator<node>{
public int compare(node a,node b){
  if(a.stu>b.stu) return 1;
  else if(a.stu<b.stu) return -1;
  return 0;
}
}
*/
/*
static class node{
    int i;
    long val,ans=0;
    node(int s,long i){
      this.i = s;
      this.val = i;
    }
}*/
//////

static boolean chk(int val){
    int brr[] = arr.clone();
    int temp = m;

    while(temp>0){
      int fl=0;
      for(int i=0;i<n;i++){
        if(brr[i]>val) return false;
        int diff = val-brr[i];

        if(temp<diff){ brr[i] += temp; temp=0;break;}
        temp -= diff;

        brr[i] += diff;
        }
        if(fl==0) break;
  }

  for(int i : brr) if(i>val) return false;
  return temp==0;
}
//////
static Map<Integer,Integer> mp;
static int n,arr[],s,m;
static char[] str;
//////
  public static void main(String[] args)throws Exception{
    int t;
    //t = inpi();
    t=1;

    for(int z=1;z<=t;z++){
      n = inpi();
      m = inpi();

      arr = new int[n];
      int min = 999999999,max = 0;
      for(int i=0;i<n;i++) {
        arr[i] = Integer.parseInt(br.readLine());
        min = Math.min(min,arr[i]);
        max = Math.max(max,arr[i]);
      }

      max +=m;
      int l=min,r=max;

      while(l<=r){
        int mid = l+(r-l)/2;
        if(chk(mid)) {min = mid; r = mid-1;}
        else l = mid+1;
      }

      System.out.println(min+" "+max);
    }
//////
  }
}
