#include <bits/stdc++.h>
using namespace std;

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int n,q;
    cin>>n>>q;
    vector<int>a(n);
    for(int i=0,x=0;i<n;i++){
        cin>>a[i];
        a[i]+=x;
        x=a[i];
    }
    while(q--){
        int t;
        cin>>t;
        cout<<(upper_bound(a.begin(),a.end(),t)-a.begin()+1)<<"\n";
    }
} 
题目的核心就是先把输入的那 n 个数变成前缀和。
前缀和的意思是:每一位都表示从开头加到这里一共是多少。
比如原数组是:
3 5 2 4
前缀和就是:
3 8 10 14
这样做的好处是,后面每次给你一个 t,
你只需要在前缀和里找“第一个大于 t 的位置”就行了,
不用每次都从头开始累加。
C++ 里可以直接用 upper_bound 来找这个位置。
upper_bound 返回的是“第一个大于 t 的元素的指针”,
减去 begin() 就是下标,再 +1 就是答案。
整体流程:
1. 读入 n 个数,顺便算出前缀和
2. 每次查询给一个 t
3. 在前缀和里用 upper_bound 找到第一个大于 t 的位置
4. 输出它的下标 + 1