#include <iostream>
#include <queue>
#include <vector>
#include <set>
using namespace std;
//本题的要求我们每次对一组数据种的最小值进行操作,操作m次以后输出数据中的最大值
/*本题我们的实现思路是,利用两个优先队列(大根堆和小根堆),以及一个普通队列来实现
,其中大根堆用来寻找最大值,小根堆用来操作最小数,普通队列的先进后出用来实现具体加多少(也就是数列bj)*/
int main() {
int n{},m{};//定义n个数据和m次操作
cin>>n>>m;
int M=m;//记录一下m的值,因为要用两次
priority_queue<int,vector<int>,greater<int> >a_min;//定义一个小根堆
priority_queue<int> a_max;//定义一个大根堆
queue<int> b;//定义普通队列
while(n--)//对于n个数据
{
int x;
cin>>x;
a_min.push(x);
a_max.push(x);//将它们同时都推入大小根堆中
}
while(m--)//对于每次操作的值
{
int x;
cin>>x;
b.push(x);//将它们推入普通队列,后面要用到先进后出
}
while(M--)//一共m次操作
{
int k=a_min.top();//首先记录小根堆的顶端,也就是最小值
k+=b.front();//让这个值加上操作值
b.pop();//让操作值出队
a_min.pop();
a_min.push(k);//更新小根堆
a_max.push(k);//更新大根堆
cout<<a_max.top()<<endl;//此时大根堆的顶部就是本次操作后的最大值
}
return 0;
}
// 64 位输出请用 printf("%lld")