给定一个有n个元素的正整数数列 a[1],a[2],…,a[n],你需要依次进行m个操作,操作有两类: 1 i d:给定i,d,将 a[i] 加上 d; 0 k:给定k,求最小的r,使得a[1]+a[2]+⋯+a[r]的值>=k,如果没有找到,输出“-1”。
#include<bits/stdc++.h>
using namespace std;
long long n,m,x,y,z;
long long a[500005],C[2000010];
void add(long long x,long long k)
{
while(x<=n)
C[x]+=k,x+=x&(-x);
}
long long sum(long long x)
{
long long ans=0;
while(x!=0)
ans+=C[x],x-=x&(-x);
return ans;
}
int main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]),add(i,a[i]);
for(int i=1;i<=m;i++)
{
scanf("%lld%lld",&x,&y);
if(x==1)
scanf("%lld",&z),add(y,z);
else
{
for(int j=1;j<=n;j++)
{
if(sum(j)>=y)
{
printf("%d",j);
goto school;
}
}
printf("-1");
school:;
cout<<'\n';
}
}
return 0;
}