#include <iostream>
#include <algorithm>
#include <string>
// #include <sstream>
// #include <fstream>
// #include <iomanip>
#include <chrono>
#include <numeric>
#include <utility>
#include <functional>
#include <bitset>
#include <tuple>
#include <queue>
#include <stack>
#include <vector>
#include <array>
// #include <unordered_map>
// #include <unordered_set>
#include <set>
#include <map>
// #include <deque>
#include <climits>
#include <cstring>
#include <cmath>
#include <cassert>
#include <cstdio>
using namespace std;
using namespace std::chrono;
// using namespace placeholders;
// using namespace __gnu_pbds;
// template<typename TypeInfo>
// using new_set = tree< // find_by_order & order_of_key
// TypeInfo ,
// null_type ,
// less<TypeInfo> ,
// rb_tree_tag ,
// tree_order_statistics_node_update
// > ;
void debug_out() { cerr << endl; }
template <typename HEAD, typename... TAIL>
void debug_out(HEAD H, TAIL... T) {
cerr << " " << to_string(H);
debug_out(T...);
}
#ifdef HELL_JUDGE
#define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
#else
#define debug(...) 0
#endif
const int MAXM = (int)1e5+100;
const int MAXN = (int)2e5+100;
const int MOD = (int)1e9+7;
// default size is considered MAXN
long long arr[MAXN];
vector<int> seg_tree[4*MAXN];
// BUILD THE SEGMENT TREE
void build(int current_node , int left_, int right_){
if(left_ == right_) {
seg_tree[current_node].push_back(arr[left_]);
return ;
}
int mid_point = left_ + (right_ - left_) / 2;
build(2*current_node, left_ , mid_point);
build(2*current_node+1, mid_point+1 , right_);
merge(
seg_tree[current_node*2].begin() , seg_tree[2*current_node].end() ,
seg_tree[current_node*2+1].begin() , seg_tree[2*current_node+1].end(),
back_inserter(seg_tree[current_node])
);
return ;
}
int query(int current_node , int start , int end , int member){
if(seg_tree[current_node].back() < member){
return -1;
}
if(start == end){
if(seg_tree[current_node].back() < member){
return -1;
}else{
seg_tree[current_node].back() -= member;
return start;
}
}
int mid = (start + end) /2;
int ans=-1;
if(seg_tree[2*current_node].back() >=member){
ans = query(2*current_node , start , mid , member);
}else{
ans = query(2*current_node+1 ,mid+1 , end , member);
}
seg_tree[current_node].clear();
merge(
seg_tree[current_node*2].begin() , seg_tree[2*current_node].end() ,
seg_tree[current_node*2+1].begin() , seg_tree[2*current_node+1].end(),
back_inserter(seg_tree[current_node])
);
return ans;
}
int main(void){
#ifdef HELL_JUDGE
freopen("input","r",stdin);
freopen("output","w",stdout);
freopen("error","w",stderr);
#endif
#ifdef HELL_JUDGE
auto INITIAL_TIME = high_resolution_clock::now();
#endif
int n , m; cin >> n >> m;
for(int i=0;i<n;++i){
cin >> arr[i];
}
build(1 , 0 , n-1 );
while(m--){
int x; cin >> x;
cout << query(1 , 0 , n-1 , x) +1 << '\n';
}
#ifdef HELL_JUDGE
auto FINAL_TIME = high_resolution_clock::now();
cout << "Time : "
<< duration_cast<milliseconds>(FINAL_TIME-INITIAL_TIME).count()
<< " ms" << '\n';
#endif
return 0;
}