传送门 题意:好理解 思路:后面数太大,不能用暴力。考虑数比较大,但又是连续的区间,使用前缀和构建一个新的序列。 再二分这个序列的区间,寻找正好大于等于目标
传送门 题意:好理解
思路:后面数太大,不能用暴力。考虑数比较大,但又是连续的区间,使用前缀和构建一个新的序列。
再二分这个序列的区间,寻找正好大于等于目标(lower_bound)的数。
ps;被cin/cout坑死,输入输出量太大 还是scanf/printf稳
using namespace std;
const ll maxn = 1000000 + 5;
const ll mod= 1e9+7;
//ll b[maxn];
//ll vis[maxn], Bool[maxn];
//ll a[maxn];
ll ai[maxn],a[maxn],num[maxn],sum[maxn];
using namespace std;
//vector<ll>a;
ll bsearch5(ll low,ll high,ll k){//直接套模板 k==key
ll mid;
while(low < high){
mid = low + (high -low)/2;//mid==被分的区间
if(sum[mid] >= k){
high = mid;
}
else{
low = mid + 1;
}
}
return num[high];
}
int main() {
ios::sync_with_stdio(false);
ll n,q;
scanf("%lld %lld",&n,&q);
//数字的个数
//数字
ll ty=n;
ll cnt=0;
while(n--)
{
cnt++;
//cin>>ai[cnt]>>num[cnt];
scanf("%lld %lld",&ai[cnt],&num[cnt]);
//sum+=ai[cnt];
//cnt++;
}
cnt=0;
ll t=0;
ll k;
for(ll i=1;i<=ty;i++)
{
sum[i]=ai[i]+t;
t=sum[i];
}
for(ll i=0;i<q;i++)
{
scanf("%lld",&k);
printf("%lld\n",bsearch5(1,ty,k));
}
return 0;
}