前缀和维护好音符时间求和数组,再去查找t时刻在前缀和数组中的最大插入位

置,查找用二分查找函数upper_bound(),时间复杂度O(Q*logN)

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

const int Max = 50002;
int sum_B[Max];

int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    int N,Q;
    cin>>N>>Q;
    for(int i = 1;i <= N;i++)
        cin>>sum_B[i];
    for(int i = 2;i <= N;i++)    //前缀和
        sum_B[i] += sum_B[i-1];
    
    for(int i = 1;i <= Q;i++){
        int q;
        cin>>q;
        cout<<upper_bound(sum_B+1, sum_B+N+1, q) - sum_B;
        cout<<'\n';
    }
    return 0;
}