#include <stdio.h>

int main()
{
  int n /*荷物の数*/
    ,k /*トラックの数*/
    ,sum=0 /*荷物重量の合計*/
    ,M /*真ん中（初期値sum/k）*/
    ,L=0 /*左（初期値Nimotu[]のMAX）*/
    ,R /*右 （初期値sum）*/
    ,NIZUKURI /*トラックにつめる荷物の重さ合計*/
    ,hantei /*トラックが余ったかの判定*/
    ,x=0 /*MIN候補の個数*/
    ,MIN=9999999999 /*最小値の値*/
    ,i,j;/*変数*/
  
  scanf("%d%d",&n,&k);
  
  int Nimotu[n] /*荷物のそれぞれのおもさ*/
    ,Kouho[n]; /*MIN候補*/
  
  for(i=0;i<n;i++)/*荷物の重さそれぞれ入力*/
    {
      scanf("%d",&Nimotu[i]);
      sum+=Nimotu[i];
      if(L<Nimotu[i])L=Nimotu[i];
    }

  R=sum;
  M=sum/k;
  
  while(L<R)
    {
      j=0;
      hantei=1;//初期化
      
      for(i=0;i<k;i++)//トラックを交換
	{
	  NIZUKURI=0;//荷物量を初期化

	  if(j==n)//
	    {
	      hantei=0;
	      break;
	    }
	  
	  while(1)
	    {
	      NIZUKURI+=Nimotu[j];
	      
	      if(NIZUKURI>M || j==n)
		{
		  break;
		}
	      else
		{
		  j++;
		}
	    }
	}
      
      if(j==n&&i==k)
	{
	  Kouho[x++]=M;
	  hantei=0;
	}

      if(hantei==0)
	{
	  R=M; 
	}
      else
	{
	  L=M+1; 
	}
      M=(L+R)/2;
    }

  for(i=0;i<x;i++)
    {
      if(MIN>Kouho[i])
	{
	  MIN=Kouho[i];
	}
    }

    if(x!=0)
    {
      printf("%d\n",MIN);
    }
  else
    {
      printf("%d\n",M);
    }
  
	  
  return 0;

}

