#include<iostream>
#include<cstring>
#include<stdlib.h>
using namespace std;


class CAllocation{
	
public:
	CAllocation();
	void SearchMaxCapa(void);
	bool InputAndCheckData(void);
	void PrintMaxCapa(void);
	
private:
	static const long NUM_OBJECT_MAX = 100000;	//荷物の数の最大値
	static const long TRUCK_MAX = 100000;		//トラックの数の最大値
	static const long WEIGHT_MAX = 10000;		//荷の重さの最大値
	long numObject;		//荷物の数
	long truck;			//トラックの数
	short weight[NUM_OBJECT_MAX];	//荷の重さ
	long maxCapacity;	//最大積載量
};


CAllocation::CAllocation() : numObject(0), truck(0), weight(), maxCapacity(0){
}


/*
-------------------------------------
SearchMaxCapa
	in     : なし
	return : なし
-------------------------------------
*/
void CAllocation::SearchMaxCapa(void){
	
	long tmpMaxCapa = 0;	//取りうる最大積載量の最大値
	long tmpMinCapa = 0;	//取りうる最大積載量の最小値
	long tmpCapa = 0;		//tmpMaxCapaとtmpMinCapaの中央値
	long tmpTruck = 0;
	
	//取りうる最大積載量の最大値を求める
	for(long i = 0; i < numObject; i++){
		tmpMaxCapa += weight[i];
	}
	
	maxCapacity = tmpMaxCapa / 2;
	tmpCapa = maxCapacity;
	tmpTruck = truck;
	
	while(1){
		//ある最大積載量ですべての荷を積められるか求める
		for(long i = 0; i < numObject; i++){
			tmpCapa -= weight[i];
			
			if(tmpTruck == 0){
				//全ての荷を積めなかったとき、ループを抜ける
				break;
			}
			else if(tmpCapa < 0){
				//最大積載量を超えたので、次のトラックにする。
				tmpTruck--;
				tmpCapa = maxCapacity;
				i--;
			}
			else{
				//処理なし
			}
		}
		
		if(tmpTruck > 0){
			//ある最大積載量ですべての荷を積めたとき、その最大積載量を取りうる最大積載量の最大値にsetする。
			tmpMaxCapa = maxCapacity;
		}
		else{
			//ある最大積載量ですべての荷を積めなかったとき、その最大積載量を取りうる最大積載量の最小値にsetする。
			tmpMinCapa = maxCapacity;
		}
		
		maxCapacity = ((tmpMaxCapa - tmpMinCapa) / 2) + tmpMinCapa;
		tmpCapa = maxCapacity;
		
		tmpTruck = truck;
		
		if((tmpMaxCapa - tmpMinCapa) == 0){
			break;
		}
		else if((tmpMaxCapa - tmpMinCapa) == 1){
			//取りうる最大積載量の最大値と最小値の差が1のとき、最小値ですべての荷を積めるかCheckする。
			maxCapacity = tmpMinCapa;
			
			for(long i = 0; i < numObject; i++){
				tmpCapa -= weight[i];
				
				if(tmpTruck == 0){
					break;
				}
				else if(tmpCapa < 0){
					//最大積載量を超えているので次に回す。
					tmpTruck--;
					tmpCapa = maxCapacity;
					i--;
				}
				else{
					//処理なし
				}
			}
			
			if(tmpTruck == 0){
				maxCapacity = tmpMaxCapa;
			}
			break;
		}
		else{
			//処理なし
		}
	}
	
	return;
}


/*
-------------------------------------
InputAndCheckData()
	in     : なし
	return : bool型
-------------------------------------
*/
bool CAllocation::InputAndCheckData(void){
	
	cin >> numObject >> truck;
	
	//荷物の数, トラックの数の制約Check
	if((numObject < 1) || (numObject > NUM_OBJECT_MAX) ||
	   (truck < 1) || (truck > TRUCK_MAX)){
		return false;
	}
	
	//荷の重さの制約Check
	for(long i = 0; i < numObject; i++){
		cin >> weight[i];
		if((weight[i] < 1) || (weight[i] > WEIGHT_MAX)){
			return false;
		}
	}
	
	return true;
}

/*
-------------------------------------
PrintMaxCapa()
	in     : なし
	return : なし
-------------------------------------
*/
void CAllocation::PrintMaxCapa(void){
	
	cout << maxCapacity << endl;
	
	return;
}



int main(){
	
	CAllocation* pAllocation = new CAllocation;
	
	if(!pAllocation->InputAndCheckData()){
		return -1;
	}
	pAllocation->SearchMaxCapa();
	pAllocation->PrintMaxCapa();
	
	delete pAllocation;
	
	return 0;
}





Measured memory_bytes: 3112