Pagini recente » Cod sursa (job #2495805) | Cod sursa (job #2442843) | Cod sursa (job #1686984) | Cod sursa (job #659957) | Cod sursa (job #2374089)
#include <bits/stdc++.h>
#define LMAX 100005
using namespace std;
int n,AIB[LMAX];
void Update(int poz,int val){
for(;poz<=n;poz+=(poz&-poz))
AIB[poz]+=val;
}
int Query(int poz){
int ans=0;
for(;poz>0;poz-=(poz&-poz))
ans+=AIB[poz];
return ans;
}
int Query2(int val){
int ans=0,bit=1;
for(;bit<n;bit<<=1);
for(;bit>0;bit>>=1){
if(bit+ans<=n&&AIB[bit+ans]<=val){
val-=AIB[bit+ans];
ans+=bit;
}
}
if(val!=0)
return -1;
return ans;
}
int main(){
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
int q;
scanf("%d %d",&n,&q);
for(int i=1;i<=n;++i){
int x;
scanf("%d",&x);
Update(i,x);
}
while(q--){
int tip,a,b;
scanf("%d",&tip);
if(tip==0){
scanf("%d %d",&a,&b);
Update(a,b);
}
else if(tip==1){
scanf("%d %d",&a,&b);
printf("%d\n",Query(b)-Query(a-1));
}
else{
scanf("%d",&a);
printf("%d\n",Query2(a));
}
}
return 0;
}