#include <bits/stdc++.h>
 
#define X first
#define Y second
#define MP make_pair
#define ll long long 
 
using namespace std;
 
const int N = 1e5 + 123;

struct node{
	node *left, *right;
	ll key, pr, size, tt;
	node(ll val){
		key = val;
		pr = rand() << 15;
		cout << pr << "\n";
		size = 1;
		tt = 0;
		left = right = nullptr;
	}
};

int get_sz(node* v){
	return v == nullptr ? 0 : v->size;
}

node* update(node* root){
	if(root == nullptr)
		return nullptr;
	root->size = get_sz(root->left) + get_sz(root->right) + 1;
	if(root->left != nullptr){
		root->left->key += root->tt;
		root->left->tt += root->tt;	
	}
	if(root->right != nullptr){
		root->right->key += root->tt;
		root->right->tt += root->tt;	
	}
	root->tt = 0;
	return root;
}

pair<node*, node*> split(node* root, ll key){
	if(root == nullptr){
		return MP(nullptr, nullptr);
	}
	root = update(root);
	if(root->key >= key){
		pair<node*, node*> splitted = split(root->left, key);
		splitted.X = update(splitted.X);
		splitted.Y = update(splitted.Y);
		root->left = splitted.Y;                   
		root = update(root);
		return MP(splitted.X, root);
	}
	else{
		pair<node*, node*> splitted = split(root->right, key);
		splitted.X = update(splitted.X);
		splitted.Y = update(splitted.Y);
		root->right = splitted.X;
		root = update(root);
		return MP(root, splitted.Y);
	}
}
              
node* insert(node* root, node* vertex){
	if(root == nullptr){
		return vertex;
	}
	root = update(root);
	cout << root->key << " -- " << vertex->key << "\n";
	if(root->pr > vertex->pr){
		if(root->key > vertex->key){
			root->left = insert(root->left, vertex);
			update(root->left);
		}
		else{
			root->right = insert(root->right, vertex);
			update(root->right);
		}
	}
	else{
		pair<node*, node*> splitted = split(root, vertex->key);
		splitted.X = update(splitted.X);
		splitted.Y = update(splitted.Y);
		vertex->left = splitted.X;
		vertex->right = splitted.Y;
		root = vertex;
	}
	root = update(root);
	return root;
}

int n, k;
ll a[N];

ll solve(ll val){
	node* root = nullptr;
	ll cnt = 0;
	for(int i = 1;i <= n;i++){
		if(i == 1){
			root = new node(a[1]);
		}
		else{
			root->tt += a[i], root->key += a[i];
			root = update(root);
			root = insert(root, new node(a[i]));
		}
		cout << val << " " << root->size << "\n";
		pair<node*, node*> splitted = split(root, val);
		if(splitted.Y != nullptr){
			cnt += splitted.Y->size;
		}
		cout << val << " " << root->size << "\n";
	}
	return cnt;
}

int main () {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	srand(chrono::system_clock::now().time_since_epoch().count());
   	
   	cin >> n >> k;
   	for(int i = 1;i <= n;i++){
   		cin >> a[i];
   	}
   	ll tl = -1e14 - 1, tr = 1e14 + 1;
   	ll tp = 1e14;
   	while(tl <= tr){
   		ll tm = (tl + tr) / 2;
   		ll cnt = solve(tm);
   	//	cout << cnt << " " << tm << "\n";
   		if(cnt < k){
   			tr = tm - 1;
   		}
   		else{
   			tl = tm + 1;
   			tp = tm;
   		}
   	}
   	cout << tp;
   	return 0;
}