描述
在 3023 年,bessie 是 E 星球最大的农场主,一共有 n 个牛群,牛群 1∼n 编号,每个牛群都有一定数量的奶牛。bessie 隔一段时间,会向第 l 到第 r 的牛群中的每个牛群增加 c 头奶牛。在增加 p 次后,bessie 按照牛群奶牛的数量升序排序并且重新编号(还是 1∼n 编号), q 次查询,每次查询,需要知道奶牛数量最接近 x 并且不小于 x 头的牛群编号是多少(如果有相同数字,输出最靠左的编号)?
输入描述
输入包含两个整数 n,p。
输入一行 n 个数。
接下来 p 行,每行三个整数 l,r,c,表示第 l 到第 r 的区间内,每个牛群增加 c 头奶牛。
接下来输入一个 q。
接下来 q 行,每行一个 x。
输出描述
最后输出bessie 隔一段时间,会向第 l 到第 r 的牛群中的每个牛群增加 c 头奶牛。在增加 p 次后,bessie有 q 次查询,每次查询,需要知道奶牛数量最接近 x 并且不小于 x 头的牛群编号是多少(如果有相同数字,输出最靠左的编号)?
样例输入 1
8 3 1 2 10 8 1 5 1 1 7 8 12 1 8 4 2 3 12 2 18 17
样例输出 1
7 5
#include<bits/stdc++.h>
using namespace std;
const int M=1e5+4;
int a[M],s[M];
int n,m,c,l,r;
void erfen(int x){
int v=n;
int L=1,R=n;
while(L<=R){
int mid=(L+R)/2;
if(a[mid]>=x){
v=mid;
R=mid-1;
}else if(a[mid]<x){
L=mid+1;
}
}
cout<<v<<endl;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
s[i]=a[i]-a[i-1];
}
for(int i=0;i<m;i++){
scanf("%d%d%d",&l,&r,&c);
s[l]+=c;
s[r+1]-=c;
}
for(int i=1;i<=n;i++){
a[i]=a[i-1]+s[i];
}
sort(a+1,a+n+1);
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%d",&c);
erfen(c);
}
return 0;
}