#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")