#include <map>
#include <cmath>
#include "pch.h"
#define INF (0x3f3f3f3f)
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Trie {
public:
Trie* next[26] = { nullptr }; //存储可能的下一个字符(小写字母共26位)
int isEnd;
Trie() { isEnd = -1; }
// 从头建立树
void insert(string s, int pos) {
Trie* cur = this;
for (int i = 0; i < s.length(); ++i) {
int t = s[i] - 'a';
if (cur->next[t] == nullptr) {
cur->next[t] = new Trie();
}
cur = cur->next[t];
}
cur->isEnd = pos;
}
};
vector<string> split(const string &str, const char pattern)
{
vector<string> res;
stringstream input(str); //读取str到字符串流中
string temp;
while (getline(input, temp, pattern))
{
res.push_back(temp);
}
return res;
}
class Solution {
public:
bool isValidSerialization(string preorder) {
vector<string>strs = split(preorder, ',');
stack<string>room;
if (strs.size() == 0)
return 1;
for (int i = 0; i < strs.size(); ++i) {
cout << i << ' ' << strs[i] << endl;
if (strs[i] != "#")
room.push(strs[i]);
else {
while (!room.empty() && room.top() == "#") {
cout << "first" << endl;
room.pop();
if (room.size() != 0) {
room.pop();
}
else
return 0;
}
room.push(strs[i]);
cout << "sec " << endl;
}
}
if (room.size() == 1 && room.top() == "#")
return 1;
else
return 0;
}
vector<string>split(string s, char p) {
stringstream S;
S.str(s);
vector<string>res;
string save;
while (getline(S, save, p)) {
res.push_back(save);
}
return res;
}
};
class Solution {
public:
vector<int> missingTwo(vector<int>& nums) {
int N = nums.size() + 2;
vector<int>res;
nums.push_back(0);
nums.push_back(0);
for (int i = 0; i < N; ++i) {
while (nums[i] != 0 && nums[i] != i + 1) {
swap(nums[i], nums[nums[i] - 1]);
}
}
for (int i = 0; i < N; ++i) {
if (nums[i] == 0)
res.push_back(i + 1);
}
return res;
}
};
class Solution {
public:
int calculate(string s) {
int l = 0, r = 0;
int res = 0;
char oper;
while (l < s.length() && (s[l] == '(' || s[l] == ' '))
l++;
if (s[l] == '-') {
oper = '-';
l++;
}
else {
while (l < s.length() && !judge(s[l]))
l++;
if (l == s.length())
return 0;
r = max(r, l + 1);
while (r < s.length() && judge(s[r]))
r++;
res = stoi(s.substr(l, r - l));
cout << res << endl;
while (r < s.length() && s[r] != ' ')
r++;
oper = s[r];
cout << oper << endl;
l = r + 1;
}
while (l < s.length()) {
while (l < s.length() && !judge(s[l]))
l++;
if (l == s.length())
break;
r = max(r, l + 1);
while (r < s.length() && judge(s[r]))
r++;
int val = stoi(s.substr(l, r - l));
cout << val << endl;
if (oper == '+')
res += val;
else
res -= val;
while (r < s.length() && s[r] != ' ')
r++;
char oper = s[r];
l = r + 1;
}
return res;
}
bool judge(char s) {
return s >= '0'&&s <= '9';
}
};
class Solution {
public:
int search(vector<int>& arr, int target) {
int l = 0, r = arr.size() - 1;
while (l < r) {
int mid = (l + r) >> 1;
if (arr[mid] > arr[l]) {
if (arr[mid] > target && arr[l] <= target) {
r = mid;
}
else
l = mid + 1;
}
else if (arr[mid] < arr[r]) {
if (arr[mid] < target && arr[r] >= target) {
r = mid;
}
else
l = mid + 1;
}
}
return arr[l] == target ? l : -1;
}
};
class Solution {
public:
vector<int> f;
vector<int> rank;
void Make_Set(int N)
{
for (int i = 0; i < N; i++)
{
f[i] = i;
rank[i] = 0;
}
}
int findF(int x) {
return f[x] == x ? x : f[x] = findF(f[x]);
}
void merge(int x, int y) {
int fx = findF(x), fy = findF(y);
if (fx == fy) return;
if (rank[fx] < rank[fy]) {
swap(fx, fy);
}
rank[fx] += rank[fy];
f[fy] = fx;
}
vector<string> trulyMostPopular(vector<string>& names, vector<string>& synonyms) {
int N = names.size();
unordered_map<string, int>room;
unordered_map<int, string>rroom;
vector<int>fre(N);
vector<string>res;
Make_Set(N);
if (names.size() == 0)
return res;
for (int i = 0; i < N; ++i) {
int l = names[i].find('(');
names[i][l] = '*';
int r = names[i].find(')');
string name = names[i].substr(0, l);
int val = stoi(names[i].substr(l + 1, r - l + 1));;
room[name] = i;
rroom[i] = name;
fre[i] = val;
cout << name << ' ' << fre[i] << endl;
}
for (auto s : synonyms) {
int l = s.find(',');
string a = s.substr(0, l);
string b = s.substr(l + 1, s.size() - l);
merge(room[a], room[b]);
cout << a << ' ' << b << endl;
}
for (int i = 0; i < N; ++i) {
int fa = findF(i);
if (fa != i) {
if (rroom[i] < rroom[fa]) {
rroom[i] = rroom[fa];
}
fre[i] += fre[fa];
}
}
for (int i = 0; i < N; ++i) {
int fa = findF(i);
if (i == fa) {
string name = rroom[i];
int num = fre[i];
name += "(" + to_string(num) + ")";
cout << name << endl;
res.push_back(name);
}
}
return res;
}
};
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int>res;
int x = 0, y = 0, basex = 0, basey = 0;
int M = matrix.size(), N = matrix[0].size();
while (res.size() < M*N) {
while (y < N - basey) {
res.push_back(matrix[x][y++]);
}
y--;
basex++;
while (x < M - basex) {
res.push_back(matrix[x++][y]);
}
x--;
while (y >= basey) {
res.push_back(matrix[x][y--]);
}
y++;
while (x >= basex) {
res.push_back(matrix[x--][y]);
}
x++;
basey++;
}
return res;
}
};
class Solution {
public:
int maximumScore(vector<int>& nums, int k) {
int N = nums.size(), res = 0;
int l = k, r = k;
for (int i = nums[k]; i > 0; --i) {
while (l >= 0 && nums[l--] >= i);
while (r < N&&nums[r++]>+i);
res = max(res, (r - l + 1)*i);
}
return res;
}
};
bool check(vector < int > packets, int n, int value) {
int Sum = 0, count = 0;
for (int i = 0; i < packets.size(); ++i) {
Sum += packets[i];
if (Sum >= value) {
Sum = 0;
count++;
}
}
return count >= n;
}
int maxAmount(vector < int > packets, int n) {
int Sum = 0;
for (int i = 0; i < packets.size(); ++i) {
Sum += packets[i];
}
int l = 0, r = Sum / 6 + 1;
cout << l << ' ' << r << endl;
while (l < r) {
int mid = (l + r) >> 1;
cout << mid << endl;
if (check(packets, n, mid)) {
l = mid;
cout << "asd" << endl;
}
else
r = mid - 1;
}
return l;
}
//9
//1 2 3 4 5 6 7 8 9
//6
int main()
{
string S;
int N;
cin >> N;
vector<int>room;
int data;
for (int i = 0; i < N; ++i) {
cin >> data;
room.push_back(data);
}
cin >> N;
cout << maxAmount(room, N);
return 0;
}